Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > SAS Base
SAS Base Forum d'entraide sur SAS base : étape data, procédures non statistiques, procédures non graphiques, SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/07/2011, 01h53   #1
Membre éclairé
 
Homme
statisticien
Inscription : mai 2011
Messages : 212
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : statisticien
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : mai 2011
Messages : 212
Points : 319
Points : 319
Par défaut Expressions régulières le retour : débugage et optimisation

Bonsoir,

J'essaye de nettoyer une variable contenant beaucoup d'abréviations "espacées".

Par exemple séparés par des espaces : "E H P A D" à la place de "EHPAD"
ou bien par des points : "O.N.U" à la place de "ONU"
et quelque fois combinaison des deux (sans être mélangés) "O.T.A.N O.N.U" à la place de "OTAN ONU"

Pour être clair dans mon exemple théorique je cherche à supprimer les blancs ou les points entre les lettres isolées par des points ou des blancs et uniquement dans ces cas là, sachant que dans une même abréviation le séparateur est soit "espace" de partout soit "." de partout mais pas les deux mélangés, par contre dans une même modalité on peut avoir un mélange avec une abréviation séparée avec des points et une autre par des espaces comme dans l'observation n°21
Je ne cherche pas non plus à remplacer tous les points par des espaces (trop facile )

J'ai réalisé un code qui fonctionne...

Enfin qui fonctionne presque !

Car dans certains cas il ne fonctionne pas contre toute attente
Deux exemples sont donnés par les observations n°22 et 25.
Dans le premier cas I.M.E n'a pas été remplacé par IME
et dans le deuxième cas E.H.P.A.D n'a pas été remplacé par EHPAD
alors que la même expression régulière a marché pour l'abréviation juste à gauche...

Je ne vois pas où est mon erreur...

Et ensuite j'aimerais savoir si quelqu'un a des idées pour optimiser le code car je le trouve très lourdingue pour faire une chose somme toute assez simple (mais j'avoue que je n'ai pas trouvé plus simple )

Comment avoir un code plus compact ? Par récursivité ? (si ça existe dans les expressions régulières...)

Edit : Si vous avez une solution sans expressions régulières je suis aussi preneur, mais a moins d'une fonction SAS ad-hoc que je ne connaitrais pas, il me semble que ce soit pas si simple que ça à programmer sans expressions régulières(ou alors je n'ai pas pris le problème par le bon côté).


Le code

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 
DATA jjj;
input mot $50.;
mot=' '!!mot;
cards;
E H P A D 
HOPITAL E H P A D
LOGEMENT E H P A D
C A T LES CERISIERS
C A T T P LES SAULES
CENTRE E H P A D 
CENTRE S L I 
CENTRE S E C U
C A T LES ROSIERS I M E
I M E
INSTITUT MEDICO EDUCATIF
CENTRE AIDE PAR LE TRAVAIL C A T LES GRISONS
E.H.P.A.D
HOPITAL E.H.P.A.D
LOGEMENT E.H.P.A.D
C.A.T LES CERISIERS
C.A.T.T.P LES SAULES
CENTRE E.H.P.A.D
CENTRE S.L.I
CENTRE S.E.C.U
I M E I.M.E
I.E.M I.M.E
INSTITUT MEDICO EDUCATIF
CENTRE AIDE PAR LE TRAVAIL C.A.T LES GRISONS
I.M.E C.A.T.T.P E.H.P.A.D
;
run;
DATA jjj;
SET jjj;
length mot1 $50.;
mot1=mot;run;
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 
DATA jjj;SET jjj;
retain reg2-reg10 treg2-treg10;
IF _N_=1 then do;
reg10=prxparse("s/\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])(?:\s|$)/ $1$2$3$4$5$6$7$8$9$10 /");
reg9=prxparse("s/\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])(?:\s|$)/ $1$2$3$4$5$6$7$8$9 /");
reg8=prxparse("s/\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])(?:\s|$)/ $1$2$3$4$5$6$7$8 /");
reg7=prxparse("s/\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])(?:\s|$)/ $1$2$3$4$5$6$7 /");
reg6=prxparse("s/\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])(?:\s|$)/ $1$2$3$4$5$6 /");
reg5=prxparse("s/\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])(?:\s|$)/ $1$2$3$4$5 /");
reg4=prxparse("s/\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])(?:\s|$)/ $1$2$3$4 /");
reg3=prxparse("s/\s([A-Z])\s([A-Z])\s([A-Z])(?:\s|$)/ $1$2$3 /");
reg2=prxparse("s/\s([A-Z])\s([A-Z])(?:\s|$)/ $1$2 /");
treg10=prxparse("s/\s([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])(?:\s|$)/ $1$2$3$4$5$6$7$8$9$10 /");
treg9=prxparse("s/\s([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])(?:\s|$)/ $1$2$3$4$5$6$7$8$9 /");
treg8=prxparse("s/\s([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])(?:\s|$)/ $1$2$3$4$5$6$7$8 /");
treg7=prxparse("s/\s([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])(?:\s|$)/ $1$2$3$4$5$6$7 /");
treg6=prxparse("s/\s([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])(?:\s|$)/ $1$2$3$4$5$6 /");
treg5=prxparse("s/\s([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])(?:\s|$)/ $1$2$3$4$5 /");
treg4=prxparse("s/\s([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])(?:\s|$)/ $1$2$3$4 /");
treg3=prxparse("s/\s([A-Z])\.([A-Z])\.([A-Z])(?:\s|$)/ $1$2$3 /");
treg2=prxparse("s/\s([A-Z])\.([A-Z])(?:\s|$)/ $1$2 /");
end;
array reg {9} reg2-reg10;
array treg {9} treg2-treg10;
do i=9 TO 1 BY -1;
pos=prxmatch(treg(i), mot1);
	IF pos  then do;
		call prxchange(treg(i),-1,mot1,mot1);
		end;
end;
do i=9 TO 1 BY -1;
pos=prxmatch(reg(i), mot1);
	IF pos  then do;
		call prxchange(reg(i),-1,mot1,mot1);
		end;
end;
DROP pos reg2-reg10 treg2-treg10 i;
run;
et le résultat

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
                     1    E H P A D                                       EHPAD
                     2    HOPITAL E H P A D                               HOPITAL EHPAD
                     3    LOGEMENT E H P A D                              LOGEMENT EHPAD
                     4    C A T LES CERISIERS                             CAT LES CERISIERS
                     5    C A T T P LES SAULES                            CATTP LES SAULES
                     6    CENTRE E H P A D                                CENTRE EHPAD
                     7    CENTRE S L I                                    CENTRE SLI
                     8    CENTRE S E C U                                  CENTRE SECU
                     9    C A T LES ROSIERS I M E                         CAT LES ROSIERS IME
                    10    I M E                                           IME
                    11    INSTITUT MEDICO EDUCATIF                        INSTITUT MEDICO EDUCATIF
                    12    CENTRE AIDE PAR LE TRAVAIL C A T LES GRISONS    CENTRE AIDE PAR LE TRAVAIL CAT LES GRISONS
                    13    E.H.P.A.D                                       EHPAD
                    14    HOPITAL E.H.P.A.D                               HOPITAL EHPAD
                    15    LOGEMENT E.H.P.A.D                              LOGEMENT EHPAD
                    16    C.A.T LES CERISIERS                             CAT LES CERISIERS
                    17    C.A.T.T.P LES SAULES                            CATTP LES SAULES
                    18    CENTRE E.H.P.A.D                                CENTRE EHPAD
                    19    CENTRE S.L.I                                    CENTRE SLI
                    20    CENTRE S.E.C.U                                  CENTRE SECU
                    21    I M E  I.M.E                                    IME IME
                    22    I.E.M I.M.E                                     IEM I.M.E
                    23    INSTITUT MEDICO EDUCATIF                        INSTITUT MEDICO EDUCATIF
                    24    CENTRE AIDE PAR LE TRAVAIL C.A.T LES GRISONS    CENTRE AIDE PAR LE TRAVAIL CAT LES GRISONS
                    25    I.M.E C.A.T.T.P E.H.P.A.D                       IME CATTP E.H.P.A.D
jerome_pdv2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 07h34   #2
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
Bonjour Jérôme.
Je te propose ces transformations qui me semblent un peu plus simples à suivre, mais j'espère qu'elles couvrent tous les cas. Il s'agit de repérer les lettres isolées, séparées de celle de gauche et de celle de droite par un point ou par un espace.
Code :
1
2
3
4
5
6
DATA kkk ;
  SET jjj ;
  LENGTH mot2 $ 50 ;
  mot2 = PRXCHANGE("s/\.(\w)\./$1/",-1, mot1) ;
  mot2 = PRXCHANGE("s/( \w) (\w) /$1$2/",-1, mot2) ;
RUN ;
Est-ce que ça te conviendrait ?
Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 08h22   #3
Membre éclairé
 
Homme
statisticien
Inscription : mai 2011
Messages : 212
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : statisticien
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : mai 2011
Messages : 212
Points : 319
Points : 319
Bonjour Olivier, et bien ya de l'idée , c'est effectivement beaucoup plus simple, mais ton code ne fait pas encore tout a fait le résultat demandé.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
  Obs    mot1                                            mot2

    1    E H P A D                                       EHP AD
    2    HOPITAL E H P A D                               HOPITAL EHP AD
    3    LOGEMENT E H P A D                              LOGEMENT EHP AD
    4    C A T LES CERISIERS                             CAT LES CERISIERS
    5    C A T T P LES SAULES                            CAT TPLES SAULES
    6    CENTRE E H P A D                                CENTRE EHP AD
    7    CENTRE S L I                                    CENTRE SLI
    8    CENTRE S E C U                                  CENTRE SEC U
    9    C A T LES ROSIERS I M E                         CAT LES ROSIERS IME
   10    I M E                                           IME
   11    INSTITUT MEDICO EDUCATIF                        INSTITUT MEDICO EDUCATIF
   12    CENTRE AIDE PAR LE TRAVAIL C A T LES GRISONS    CENTRE AIDE PAR LE TRAVAIL CAT LES GRISONS
   13    E.H.P.A.D                                       EHPAD
   14    HOPITAL E.H.P.A.D                               HOPITAL EHPAD
   15    LOGEMENT E.H.P.A.D                              LOGEMENT EHPAD
   16    C.A.T LES CERISIERS                             CAT LES CERISIERS
   17    C.A.T.T.P LES SAULES                            CATTP LES SAULES
   18    CENTRE E.H.P.A.D                                CENTRE EHPAD
   19    CENTRE S.L.I                                    CENTRE SLI
   20    CENTRE S.E.C.U                                  CENTRE SEC.U
   21    I M E I.M.E                                     IME IME
   22    I.E.M I.M.E                                     IEM IME
   23    INSTITUT MEDICO EDUCATIF                        INSTITUT MEDICO EDUCATIF
   24    CENTRE AIDE PAR LE TRAVAIL C.A.T LES GRISONS    CENTRE AIDE PAR LE TRAVAIL CAT LES GRISONS
   25    I.M.E C.A.T.T.P E.H.P.A.D                       IME CATTP EHPAD
Edit : Les cas où ça ne fait pas le résultat attendu

Pour les observations 1,2,3,6,8 et 20.

Une précision supplémentaire, dans mon esprit la séparation "." est prioritaire par rapport à la séparation en " ".

Par exemple "A B.C D" doit devenir "A BC D" et non "AB.CD".





Par contre rajouté à mon code du début, ton code vient en "patch" là où mon code ne fonctionnait pas (c'était un peu le but).
Si quelqu'un a plus court ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 
DATA jjj;SET jjj;
retain reg2-reg10 treg2-treg10;
IF _N_=1 then do;
reg10=prxparse("s/\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])(?:\s|$)/ $1$2$3$4$5$6$7$8$9$10 /");
reg9=prxparse("s/\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])(?:\s|$)/ $1$2$3$4$5$6$7$8$9 /");
reg8=prxparse("s/\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])(?:\s|$)/ $1$2$3$4$5$6$7$8 /");
reg7=prxparse("s/\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])(?:\s|$)/ $1$2$3$4$5$6$7 /");
reg6=prxparse("s/\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])(?:\s|$)/ $1$2$3$4$5$6 /");
reg5=prxparse("s/\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])(?:\s|$)/ $1$2$3$4$5 /");
reg4=prxparse("s/\s([A-Z])\s([A-Z])\s([A-Z])\s([A-Z])(?:\s|$)/ $1$2$3$4 /");
reg3=prxparse("s/\s([A-Z])\s([A-Z])\s([A-Z])(?:\s|$)/ $1$2$3 /");
reg2=prxparse("s/\s([A-Z])\s([A-Z])(?:\s|$)/ $1$2 /");
treg10=prxparse("s/\s([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])(?:\s|$)/ $1$2$3$4$5$6$7$8$9$10 /");
treg9=prxparse("s/\s([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])(?:\s|$)/ $1$2$3$4$5$6$7$8$9 /");
treg8=prxparse("s/\s([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])(?:\s|$)/ $1$2$3$4$5$6$7$8 /");
treg7=prxparse("s/\s([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])(?:\s|$)/ $1$2$3$4$5$6$7 /");
treg6=prxparse("s/\s([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])(?:\s|$)/ $1$2$3$4$5$6 /");
treg5=prxparse("s/\s([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])(?:\s|$)/ $1$2$3$4$5 /");
treg4=prxparse("s/\s([A-Z])\.([A-Z])\.([A-Z])\.([A-Z])(?:\s|$)/ $1$2$3$4 /");
treg3=prxparse("s/\s([A-Z])\.([A-Z])\.([A-Z])(?:\s|$)/ $1$2$3 /");
treg2=prxparse("s/\s([A-Z])\.([A-Z])(?:\s|$)/ $1$2 /");
end;
array reg {9} reg2-reg10;
array treg {9} treg2-treg10;
do i=9 TO 1 BY -1;
pos=prxmatch(treg(i), mot1);
	IF pos  then do;
		call prxchange(treg(i),-1,mot1,mot1);
		end;
end;
do i=9 TO 1 BY -1;
pos=prxmatch(reg(i), mot1);
	IF pos  then do;
		call prxchange(reg(i),-1,mot1,mot1);
		end;
end;
DROP pos reg2-reg10 treg2-treg10 i;
run;
 
DATA kkk ;
  SET jjj ;
  LENGTH mot2 $ 50 ;
  mot2 = PRXCHANGE("s/\.(\w)\./$1/",-1, mot1) ;
   mot2 = PRXCHANGE("s/\s(\w)\s/$1/",-1, mot2) ;
RUN ;
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
  Obs    mot                                             mot2
 
    1    E H P A D                                       EHPAD
    2    HOPITAL E H P A D                               HOPITAL EHPAD
    3    LOGEMENT E H P A D                              LOGEMENT EHPAD
    4    C A T LES CERISIERS                             CAT LES CERISIERS
    5    C A T T P LES SAULES                            CATTP LES SAULES
    6    CENTRE E H P A D                                CENTRE EHPAD
    7    CENTRE S L I                                    CENTRE SLI
    8    CENTRE S E C U                                  CENTRE SECU
    9    C A T LES ROSIERS I M E                         CAT LES ROSIERS IME
   10    I M E                                           IME
   11    INSTITUT MEDICO EDUCATIF                        INSTITUT MEDICO EDUCATIF
   12    CENTRE AIDE PAR LE TRAVAIL C A T LES GRISONS    CENTRE AIDE PAR LE TRAVAIL CAT LES GRISONS
   13    E.H.P.A.D                                       EHPAD
   14    HOPITAL E.H.P.A.D                               HOPITAL EHPAD
   15    LOGEMENT E.H.P.A.D                              LOGEMENT EHPAD
   16    C.A.T LES CERISIERS                             CAT LES CERISIERS
   17    C.A.T.T.P LES SAULES                            CATTP LES SAULES
   18    CENTRE E.H.P.A.D                                CENTRE EHPAD
   19    CENTRE S.L.I                                    CENTRE SLI
   20    CENTRE S.E.C.U                                  CENTRE SECU
   21    I M E I.M.E                                     IME IME
   22    I.E.M I.M.E                                     IEM IME
   23    INSTITUT MEDICO EDUCATIF                        INSTITUT MEDICO EDUCATIF
   24    CENTRE AIDE PAR LE TRAVAIL C.A.T LES GRISONS    CENTRE AIDE PAR LE TRAVAIL CAT LES GRISONS
   25    I.M.E C.A.T.T.P E.H.P.A.D                       IME CATTP EHPAD
EDIT 2 :

SAUF QUE si cela fait toutes les choses souhaitées..., cela fait des choses non souhaitées aussi...
par exemple dans le cas "mot1+séparateur+lettre+séparateur+mot2" transformé en "mot1+lettre+mot2" cette transformation n'étant pas souhaité en théorie (bon dans la pratique je pense qu'on peut faire avec)

Code :
1
2
3
4
5
6
7
                     Obs          mot               mot1               mot2

                      1     LAUREL ET HARDY    LAUREL ET HARDY    LAUREL ET HARDY
                      2     LAUREL.ET.HARDY    LAUREL.ET.HARDY    LAUREL.ET.HARDY
                      3     LAUREL E HARDY     LAUREL E HARDY     LAURELEHARDY
                      4     LAUREL.E.HARDY     LAUREL.E.HARDY     LAURELEHARDY
jerome_pdv2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 10h39   #4
Membre confirmé
 
Inscription : janvier 2010
Messages : 185
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 185
Points : 250
Points : 250
Par défaut assertions avant et arrière

Bonjour,

je propose cette solution qui utilise les assertions avant et arrière :


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
DATA jjj;
input mot1 $50. @1 mot   $50.;
length acron $50 ;
 
/* suppression des points */
reg=prxparse('s/\.//');
call prxchange(reg,-1, mot);
 
 
/* suppression des blancs à l'intérieur des acronymes :
	= blanc entre 2 lettres isolées.
*/
reg2=prxparse('s/(?<!\w)(\w)\s(?!\w{2})/$1/');
call prxchange(reg2,-1, mot);
 
cards;
E H P A D 
HOPITAL E H P A D
LOGEMENT E H P A D
C A T LES CERISIERS
C A T T P LES SAULES
CENTRE E H P A D 
CENTRE S L I 
CENTRE S E C U
C A T LES ROSIERS I M E
I M E
INSTITUT MEDICO EDUCATIF
CENTRE AIDE PAR LE TRAVAIL C A T LES GRISONS
E.H.P.A.D
HOPITAL E.H.P.A.D
LOGEMENT E.H.P.A.D
C.A.T LES CERISIERS
C.A.T.T.P LES SAULES
CENTRE E.H.P.A.D
CENTRE S.L.I
CENTRE S.E.C.U
I M E I.M.E
I.E.M I.M.E
INSTITUT MEDICO EDUCATIF
CENTRE AIDE PAR LE TRAVAIL C.A.T LES GRISONS
I.M.E C.A.T.T.P E.H.P.A.D
;
run;
 proc print;run;
explication :
une lettre isolée est :
  1. un caractère alphanumérique \w.
  2. on la capture dans $1 => (\w)
  3. elle n'est pas précédée d'une lettre (?<!\w) => (?<!\w)(\w)
  4. elle est suivie par un espace \s => (?<!\w)(\w)\s
  5. cet espace ne doit pas être suivi par au moins 2 lettres car sinon il marque la séparation entre l'acronyme et le mot qui suit (?!\w{2})=> (?<!\w)(\w)\s(?!\w{2})

(?<!\w) et (?!\w{2}) sont de longueurs nulles : ils servent à décrire les lettres constitutives des acronymes mais ne sont pas "recouverts" par l'expression régulière entière.

Donc remplacer (?<!\w)(\w)\s(?!\w{2}) par la capture $1 a pour conséquence de supprimer le blanc \s qui suit (\w).
sasadm est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 07/07/2011, 13h58   #5
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 791
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Consultant et formateur SAS et Cognos
Secteur : Conseil

Informations forums :
Inscription : avril 2009
Messages : 1 791
Points : 4 012
Points : 4 012
on a officiellement trouvé notre champion du monde en expressions rationnelles.

__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 14h55   #6
Membre confirmé
 
Inscription : janvier 2010
Messages : 185
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 185
Points : 250
Points : 250
@datametric: merci pour la ola et pour le titre que je m'empresse de remettre en jeu.

Pour repartir sur le sujet, j'ai réglé un peu vite le cas des points en les supprimant sans autre forme de procès. En fait le problème est le même que pour les espaces. On peut donc leur appliquer le même traitement.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 
DATA jjj;
input mot1 $50. @1 mot   $50.;
length acron $50 ;
 
/* suppression des points */
/*reg=prxparse('s/\.//');*/
reg=prxparse('s/(?<!\w)(\w)\.(?!\w{2})/$1/');
 
call prxchange(reg,-1, mot);
 
 
/* suppression des blancs à l'intérieur des acronymes :
	= blanc entre 2 lettres isolées.
*/
reg2=prxparse('s/(?<!\w)(\w)\s(?!\w{2})/$1/');
call prxchange(reg2,-1, mot);
 
cards;
E H P A D 
HOPITAL E H P A D
LOGEMENT E H P A D
C A T LES CERISIERS
C A T T P LES SAULES
CENTRE E H P A D 
CENTRE S L I 
CENTRE S E C U
C A T LES ROSIERS I M E
I M E
INSTITUT MEDICO EDUCATIF
CENTRE AIDE PAR LE TRAVAIL C A T LES GRISONS
E.H.P.A.D
HOPITAL E.H.P.A.D
LOGEMENT E.H.P.A.D
C.A.T LES CERISIERS
C.A.T.T.P LES SAULES
CENTRE E.H.P.A.D
CENTRE S.L.I
CENTRE S.E.C.U
I M E I.M.E
I.E.M I.M.E
INSTITUT MEDICO EDUCATIF
CENTRE AIDE PAR LE TRAVAIL C.A.T LES GRISONS
I.M.E C.A.T.T.P E.H.P.A.D
 LAUREL ET HARDY 
 LAUREL.ET.HARDY 
 LAUREL E HARDY   
 LAUREL.E.HARDY 
;
run;
 proc print;run;
Les phrases du type LAUREL.E.HARDY sont ainsi préservées.
sasadm est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 07/07/2011, 15h01   #7
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Même si les chinois nous envahissent, ça reste du chinois pour moi chapeau sasadm
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 10h57   #8
Membre éclairé
 
Homme
statisticien
Inscription : mai 2011
Messages : 212
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : statisticien
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : mai 2011
Messages : 212
Points : 319
Points : 319
AHHH voici un code plus plaisant !

Génial !

Merci sasadm !

Etant en congés quelques jours je repasse la semaine prochaine, j'ai encore quelques cas que je n'avais pas prévu et qui me posent problème, mais je verais tout cela plus tard, car il s'agit juste de raffinement.


Par exemple

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
DATA jjj;                                                                                                                               
input mot1 $50. @1 mot   $50.;                                                                                                          
length acron $50 ;                                                                                                                      
 
/* suppression des points */                                                                                                            
/*reg=prxparse('s/\.//');*/                                                                                                             
reg=prxparse('s/(?<!\w)(\w)\.(?!\w{2})/$1/');                                                                                           
 
call prxchange(reg,-1, mot);                                                                                                            
 
 
/* suppression des blancs à l'intérieur des acronymes :                                                                                 
      = blanc entre 2 lettres isolées.                                                                                                  
*/                                                                                                                                      
reg2=prxparse('s/(?<!\w)(\w)\s(?!\w{2})/$1/');                                                                                          
call prxchange(reg2,-1, mot);                                                                                                           
 
cards;                                                                                                                                  
I.F.S.I.ECOLE D INFIRMIERES                                                                                                             
;                                                                                                                                       
run;                                                                                                                                    
 proc print;run;
Code :
1
2
3
4
         Obs               mot1                        mot              acron    reg    reg2

          1     I.F.S.I.ECOLE D INFIRMIERE    IFSI.ECOLE D INFIRMIERE              1       2
En tout cas encore merci, ton titre décerné par DATAMETRIC et bien mérité
jerome_pdv2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2011, 17h24   #9
Membre éclairé
 
Homme
statisticien
Inscription : mai 2011
Messages : 212
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : statisticien
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : mai 2011
Messages : 212
Points : 319
Points : 319
double poste pour la fin, j'ai rajouté une reg0 au code de sasadm pour traiter les derniers cas qui me souciaient, le code ne fait pas à 100% ce que je voulais mais à 99,5% , le reste (quelques disparitions non voulues de points en rouge) je m'en arrangerais autrement et sont au final sans trop d'importance par rapport à l'utilisation que je veux en faire

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
 
DATA jjj;                                                                                                                               
input mot1 $50. @1 mot   $50.;                                                                                                          
length acron $50 ;                                                                                                                      
 
/* insertion d'un espace après un point suivi d'une combinaison de deux lettres/chiffres */
 
reg0=prxparse('s/\.([A-Z0-9]{2})/. $1/');
 
call prxchange(reg0,-1,mot);
 
/* suppression des points */                                                                                                            
/*reg=prxparse('s/\.//');*/                                                                                                             
reg=prxparse('s/(?<!\w)(\w)\.(?!\w{2})/$1/');                                                                                           
 
call prxchange(reg,-1, mot);                                                                                                            
 
 
/* suppression des blancs à l'intérieur des acronymes :                                                                                 
      = blanc entre 2 lettres isolées.                                                                                                  
*/                                                                                                                                      
reg2=prxparse('s/(?<!\w)(\w)\s(?!\w{2})/$1/');                                                                                          
call prxchange(reg2,-1, mot);                                                                                                           
 
cards;                                                                                                                                  
I.F.S.I.ECOLE D INFIRMIERES 
E H P A D 
HOPITAL E H P A D
LOGEMENT E H P A D
C A T LES CERISIERS
C A T T P LES SAULES
CENTRE E H P A D 
CENTRE S L I 
CENTRE S E C U
C A T LES ROSIERS I M E
I M E
INSTITUT MEDICO EDUCATIF
CENTRE AIDE PAR LE TRAVAIL C A T LES GRISONS
E.H.P.A.D
HOPITAL E.H.P.A.D
LOGEMENT E.H.P.A.D
C.A.T LES CERISIERS
C.A.T.T.P LES SAULES
CENTRE E.H.P.A.D
CENTRE S.L.I
CENTRE S.E.C.U
I M E I.M.E
I.E.M I.M.E
INSTITUT MEDICO EDUCATIF
CENTRE AIDE PAR LE TRAVAIL C.A.T LES GRISONS
I.M.E C.A.T.T.P E.H.P.A.D
LAUREL.ET.HARDY
LAURE ET HARDY
LAUREL.E.HARDY
LAUDEL E HARDI
I.F.S.I.
I.F.S.I. E.H.P.A.D.
E.MATERNELLE
;                                                                                                                                       
run;                                                                                                                                    
 proc print;run;
qui donne

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
                                          The SAS System          17:09 Tuesday, July 12, 2011   6

                                                                                           a
   m                                                                                       c r   r
 O o                                            m                                          r e r e
 b t                                            o                                          o g e g
 s 1                                            t                                          n 0 g 2

 1 I.F.S.I.ECOLE D INFIRMIERES                  IFSI ECOLE D INFIRMIERES                     1 2 3
 2 E H P A D                                    EHPAD                                        1 2 3
 3 HOPITAL E H P A D                            HOPITAL EHPAD                                1 2 3
 4 LOGEMENT E H P A D                           LOGEMENT EHPAD                               1 2 3
 5 C A T LES CERISIERS                          CAT LES CERISIERS                            1 2 3
 6 C A T T P LES SAULES                         CATTP LES SAULES                             1 2 3
 7 CENTRE E H P A D                             CENTRE EHPAD                                 1 2 3
 8 CENTRE S L I                                 CENTRE SLI                                   1 2 3
 9 CENTRE S E C U                               CENTRE SECU                                  1 2 3
10 C A T LES ROSIERS I M E                      CAT LES ROSIERS IME                          1 2 3
11 I M E                                        IME                                          1 2 3
12 INSTITUT MEDICO EDUCATIF                     INSTITUT MEDICO EDUCATIF                     1 2 3
13 CENTRE AIDE PAR LE TRAVAIL C A T LES GRISONS CENTRE AIDE PAR LE TRAVAIL CAT LES GRISONS   1 2 3
14 E.H.P.A.D                                    EHPAD                                        1 2 3
15 HOPITAL E.H.P.A.D                            HOPITAL EHPAD                                1 2 3
16 LOGEMENT E.H.P.A.D                           LOGEMENT EHPAD                               1 2 3
17 C.A.T LES CERISIERS                          CAT LES CERISIERS                            1 2 3
18 C.A.T.T.P LES SAULES                         CATTP LES SAULES                             1 2 3
19 CENTRE E.H.P.A.D                             CENTRE EHPAD                                 1 2 3
20 CENTRE S.L.I                                 CENTRE SLI                                   1 2 3
21 CENTRE S.E.C.U                               CENTRE SECU                                  1 2 3
22 I M E I.M.E                                  IME IME                                      1 2 3
23 I.E.M I.M.E                                  IEM IME                                      1 2 3
24 INSTITUT MEDICO EDUCATIF                     INSTITUT MEDICO EDUCATIF                     1 2 3
25 CENTRE AIDE PAR LE TRAVAIL C.A.T LES GRISONS CENTRE AIDE PAR LE TRAVAIL CAT LES GRISONS   1 2 3
26 I.M.E C.A.T.T.P E.H.P.A.D                    IME CATTP EHPAD                              1 2 3
27 LAUREL.ET.HARDY                              LAUREL. ET. HARDY                            1 2 3
28 LAURE ET HARDY                               LAURE ET HARDY                               1 2 3
29 LAUREL.E.HARDY                               LAUREL.E HARDY                               1 2 3
30 LAUDEL E HARDI                               LAUDEL E HARDI                               1 2 3
31 I.F.S.I.                                     IFSI                                         1 2 3
32 I.F.S.I. E.H.P.A.D.                          IFSI EHPAD                                   1 2 3
33 E.MATERNELLE                                 E MATERNELLE                                 1 2 3
merci pour l'astuce des assertions droite et gauche, je n'ai pas eu le temps de me plonger dans la technique, mais je pense que ça me servira ultérieurement vu que dans d'autres parties du code j'ai développé un système assez lourd d'expression régulières qui potentiellement pourraient être grandement simplifiées en utilisant ces techniques



Merci !!!!
jerome_pdv2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h19.


 
 
 
 
Partenaires

Hébergement Web