Pages

Tranwrd plusieurs mots dans un macro-programme sujet

vendredi 28 mars 2014




Bonjour,

Je tente de faire plusieurs transformations à l'aide de TRANWRD, TRANSLATE....

Après des recherches je suis tombée sur ce post ici/ il semble aller dans le même sens que mon besoin.

Cependant les résultats ne correspondent pas à ce que je m'attendais.

Et chose bizarre, le programme semble " instable" un coup ca à l'air de fonctionner un coup non:aie: (je suis pas folle j'ai même pris des collègues à témoins). J'ai du mal à comprendre pourquoi ca marche pas:calim2:

Voici le programme et les données qui me servent de test avant de l'appliquer à mes 30M de lignes.

Dernier résultat en date, au niveau du %if...le scan ne garde que la dernière valeur (O...de O Malley est supprimé)


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


data test;
input nom . ;
cards;
SAINTPIERRE
SAINTE-MARIE
ÀU
DU CON
DE SOUSA
DA SOUSA
DE LA CHEVROTIERE
O MALLEY
LADUNE
DELANOY
L'heritière
O'Formidable
Normal
;
run;


%let twrd_to= 'ST';
%let twrd_from= 'SAINT';
%let twrd_from1=DA|DU|DE|DE LA|O/*|L'|O'*/;*/ /*Pour extra : ne fonction pas à cause de l'apostrophe*/;

%macro transformation;

DATA test_res;
SET test;

/*Similarité phonétique*/
Nom_S = soundex(nom);

/*Remplacer SAINT par ST*/
Nom_T1=tranwrd(nom, &twrd_from.,&twrd_to.);

/*REMPLACER les particules par rien*/

%do i=1 %TO 5; /* J'ai l'impression que le problème se situe ici*/
%let word=%scan("&twrd_from1.",&i.,"|");
IF FIND(upcase(Nom_T1),"&word.") ne 0 then do;
/* Si l'expression est trouvée alors */
Nom_T2=tranwrd(upcase(Nom_T1),"&word. "," "); /* je la remplace par rien */
end;
%end;

/*IF Nom_T2="" then Nom_T2=nom_T1;*/

/*Quid des observations qui ne nécessitent pas de transformation*/
/*Si je mets pas cette partie pourquoi les autres lignes ne sont pas alimentées ????*/

/*Supprimer ou remplacer caractères spéciaux */
Nom_T=strip(translate(compress(upcase(nom_T2), &remove.),&trans_to.,&trans_from.));

run;
%mend transformation;

%transformation;



Merci pour vos lumières.

Petit extra : pouvoir prendre en charge le L' et les O' ...dans ma variable twrd_from1...quelques petits soucis avec les apostrophes.




Aucun commentaire:

Enregistrer un commentaire