Pages

Affichage des articles dont le libellé est macroprogramme. Afficher tous les articles
Affichage des articles dont le libellé est macroprogramme. Afficher tous les articles

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.