Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Macro
Macro Forum d'entraide sur le langage Macro de SAS
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 09/04/2008, 11h17   #1
Membre du Club
 
Inscription : novembre 2007
Messages : 120
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 120
Points : 56
Points : 56
Par défaut Passer des guillemets à travers la compilation

Bonjour à tous !

Me revoilà avec ce bout de 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
 
/*création de la table d'entrée*/
 
proc sql; * Ordonnancement de la TABLE en fonction des champs à insérer en premier ;
CREATE TABLE taiav4 (SampleName char, Matrice char, Description char(25));
INSERT INTO taiav4 (SampleName, Matrice, Description) VALUES ('nom1', 'matrice1', 'description1');
INSERT INTO taiav4 (SampleName, Matrice, Description) VALUES ('nom2', 'matrice2', 'description2');
INSERT INTO taiav4 (SampleName, Matrice, Description) VALUES ('nom3', 'matrice3', 'description3');
quit;
 
/* Création des variables */
%let SAScolumns = "SampleName, Matrice, Description";
%let ISIOScolumns = "name_sample, ref_sample, matrix_name";
 
/* Macro-programme créant des macro-variables à partir du nom de la colonne et du numéro de l'observation de la table taiav4, contenant les valeurs de cette table*/
%macro test2(SAScolumns, ISIOScolumns);
	%let nb_SAScolumns = 3;
	%let nb_ISIOScolumns = 3;
	%put Nombre colonnes SAS : &nb_SAScolumns;
	%put Nombre colonnes ISIOS : &nb_ISIOScolumns;
	%do i=1 %TO &nb_ISIOScolumns;
		%let SAScolumn_ = %sysfunc(compress(%qscan(&SAScolumns, &i, %str(,)),%nrstr(%")));
		%let ISIOScolumn_ = %sysfunc(compress(%qscan(&ISIOScolumns, &i, %str(,)),%nrstr(%")));
		%put SAScolumn_ : &SAScolumn_;
		%put ISIOScolumn_ : &ISIOScolumn_;
		DATA _NULL_ ;
		SET work.taiav4 END=FIN ;
		CALL SYMPUT(%str(%")&ISIOScolumn_.%str(%")||COMPRESS(_N_), COMPRESS(&SAScolumn_.,"'")) ;
		IF FIN THEN CALL SYMPUT("NbObs",COMPRESS(_N_)) ;
		RUN;
	%end;
	%put Nombre observations : &NbObs;
%mend;
 
 
%test2(&SAScolumns, &ISIOScolumns);

Voici ce qui est affiché dans mon log :
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
1                                                          The SAS System                             10:34 Wednesday, April 9, 2008

1          ;*';*";*/;quit;run;
2          OPTIONS PAGENO=MIN;
3          %LET _CLIENTTASKLABEL=%NRBQUOTE(Code4);
4          %LET _EGTASKLABEL=%NRBQUOTE(Code4);
5          %LET _CLIENTPROJECTNAME=%NRBQUOTE(D:\projet\ISIBIO\Isios\Projet.egp);
6          %LET _SASPROGRAMFILE=;
7          
8          ODS _ALL_ CLOSE;
NOTE: Some of your options or statements may not be supported with the Activex or Java series of devices.  Graph defaults for these 
      drivers may be different from other SAS/GRAPH device drivers.  For further information, please contact Technical Support.
9          OPTIONS DEV=ACTIVEX;
10         FILENAME EGHTML TEMP;
NOTE: Writing HTML(EGHTML) Body file: EGHTML
11         ODS HTML(ID=EGHTML) FILE=EGHTML ENCODING='utf-8' STYLE=statdoc
11       ! STYLESHEET=(URL="file:///C:/Program%20Files/SAS/Shared%20Files/BIClientStyles/statdoc.css")
11       ! ATTRIBUTES=("CODEBASE"="http://www2.sas.com/codebase/graph/v91/sasgraph.exe") NOGTITLE NOGFOOTNOTE GPATH=&sasworklocation
11       ! ;
12         
13         %gaccessible;
14         %test2(&SAScolumns, &ISIOScolumns);
Nombre colonnes SAS : 3
Nombre colonnes ISIOS : 3
SAScolumn_ : SampleName
ISIOScolumn_ : name_sample

           _
           22
            ___________
            202

ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string, a numeric constant, a datetime constant, 
              a missing value, arrayname, (, ), +, ',', -, INPUT, NOT, OF, PUT, ^, _NEW_, ~.  

ERROR 202-322: The option or parameter is not recognized and will be ignored.

NOTE: Numeric values have been converted to character values at the places given by: (Line):(Column).
      <no line/column information available>   14:89                                    14:168
NOTE: The SAS System stopped processing this step because of errors.
NOTE: DATA statement used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds
      

SAScolumn_ : Matrice
ISIOScolumn_ : ref_sample

           _
           22
            __________
            202

ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string, a numeric constant, a datetime constant, 
              a missing value, arrayname, (, ), +, ',', -, INPUT, NOT, OF, PUT, ^, _NEW_, ~.  

ERROR 202-322: The option or parameter is not recognized and will be ignored.

NOTE: Numeric values have been converted to character values at the places given by: (Line):(Column).
      <no line/column information available>   14:91                                    14:170
2                                                          The SAS System                             10:34 Wednesday, April 9, 2008

NOTE: The SAS System stopped processing this step because of errors.
NOTE: DATA statement used (Total process time):
      real time           0.01 seconds
      cpu time            0.01 seconds
      

SAScolumn_ : Description
ISIOScolumn_ : matrix_name

           _
           22
            ___________
            202

ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string, a numeric constant, a datetime constant, 
              a missing value, arrayname, (, ), +, ',', -, INPUT, NOT, OF, PUT, ^, _NEW_, ~.  

ERROR 202-322: The option or parameter is not recognized and will be ignored.

NOTE: Numeric values have been converted to character values at the places given by: (Line):(Column).
      <no line/column information available>   14:91                                    14:170
NOTE: The SAS System stopped processing this step because of errors.
NOTE: DATA statement used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds
      

WARNING: Apparent symbolic reference NBOBS not resolved.
Nombre observations : &NbObs
15         
16         
17         %LET _CLIENTTASKLABEL=;
18         %LET _EGTASKLABEL=;
19         %LET _CLIENTPROJECTNAME=;
20         %LET _SASPROGRAMFILE=;
21         
22         ;*';*";*/;quit;run;
23         ODS _ALL_ CLOSE;
24         
25         
26         QUIT; RUN;
27

A mon avis, le problème vient de cette ligne :
Citation:
CALL SYMPUT(%str(%")&ISIOScolumn_.%str(%")||COMPRESS(_N_), COMPRESS(&SAScolumn_.,"'")) ;
J'essaie de faire passer les guillemets à travers la compilation, de façon à ce qu'ils ne soient pas interprétés pendant la compilation mais plutôt qu'ils apparaissent une fois que les macro-variables (&ISIOScolumn_.) aient été transformées en texte.

Je ne m'y prends probablement pas bien, mais auriez-vous une suggestion ?

Ou suis-je de nouveau à côté de la plaque ?

Merci bien.
raf64flo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 11h23   #2
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
tu veux faire quoi dans l'etape
Code :
1
2
3
4
5
6
 
DATA _NULL_ ;
		SET work.taiav4 END=FIN ;
		CALL SYMPUT(%str(%")&ISIOScolumn_.%str(%")||COMPRESS(_N_), &SAScolumn_.)) ;
		IF FIN THEN CALL SYMPUT("NbObs",COMPRESS(_N_)) ;
		RUN;
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 11h25   #3
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
Tu peux utiliser l'option mprint pour visualiser le code génèré par la macro.

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
 
/*création de la table d'entrée*/
 
proc sql;
* Ordonnancement de la TABLE en fonction des champs à insérer en premier ;
CREATE TABLE taiav4 (SampleName char, Matrice char, Description char(25));
INSERT INTO taiav4 (SampleName, Matrice, Description) VALUES ('nom1', 'matrice1', 'description1');
INSERT INTO taiav4 (SampleName, Matrice, Description) VALUES ('nom2', 'matrice2', 'description2');
INSERT INTO taiav4 (SampleName, Matrice, Description) VALUES ('nom3', 'matrice3', 'description3');
quit;
 
/* Création des variables */
%let SAScolumns = "SampleName, Matrice, Description";
%let ISIOScolumns = "name_sample, ref_sample, matrix_name";
OPTION mprint;
/* Macro-programme créant des macro-variables à partir du nom de la colonne et du numéro de l'observation de la table taiav4, contenant les valeurs de cette table*/
%macro test2(SAScolumns, ISIOScolumns);
	%let nb_SAScolumns = 3;
	%let nb_ISIOScolumns = 3;
	%put Nombre colonnes SAS : &nb_SAScolumns;
	%put Nombre colonnes ISIOS : &nb_ISIOScolumns;
	%do i=1 %TO &nb_ISIOScolumns;
		%let SAScolumn_ = %sysfunc(compress(%qscan(&SAScolumns, &i, %str(,)),%nrstr(%")));
		%let ISIOScolumn_ = %sysfunc(compress(%qscan(&ISIOScolumns, &i, %str(,)),%nrstr(%")));
		%put SAScolumn_ : &SAScolumn_;
		%put ISIOScolumn_ : &ISIOScolumn_;
		DATA _NULL_ ;
		SET work.taiav4 END=FIN ;
		CALL SYMPUT("&ISIOScolumn_."||COMPRESS(_N_), &SAScolumn_.) ;
		IF FIN THEN CALL SYMPUT("NbObs",COMPRESS(_N_)) ;
		RUN;
	%end;
	%put Nombre observations : &NbObs;
	%put _user_;
%mend;
 
 
%test2(&SAScolumns, &ISIOScolumns);
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 11h28   #4
Membre du Club
 
Inscription : novembre 2007
Messages : 120
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 120
Points : 56
Points : 56
Je veux créer pour chaque colonne (via la boucle %do) des variables qui contiennent le contenu de chaque ligne de la table taiav4.

Ces variables étant construites à partir du nom de la colonne de sortie (à savoir name_sample, ref_sample, ou matrix_name) avec le numéro de la ligne correspondante.

Exemple pour le premier passage de la boucle :
name_sample1 avec valeur : nom1
name_sample2 avec valeur : nom2
name_sample3 avec valeur : nom3

C'est assez clair ?
raf64flo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 11h34   #5
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
Ok, regarde la réponse ci-dessus. je crois que cela répond à ton problème.
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 11h48   #6
Responsable SAS
 
Inscription : septembre 2006
Messages : 1 973
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 1 973
Points : 4 810
Points : 4 810
Citation:
Envoyé par bahraoui
Les options MLOGIC et SYMBOLGEN sont elles aussi assez utiles!!
Code :
OPTIONS MLOGIC MPRINT SYMBOLGEN]
Elles sont à utiliser au début des programmes.
fafabzh6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 11h53   #7
Membre du Club
 
Inscription : novembre 2007
Messages : 120
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 120
Points : 56
Points : 56
Oui en effet !

C'est parfait, je commençais à ne plus y voir très clair depuis le temps que je suis sur cette erreur...

Merci beaucoup !!

L'option mprint n'est-elle pas activée par défaut ?

Par contre, les variables créées par le Call Symput ne sont pas globales. Je comptais dessus, mais après vérification vu que auparavant j'ai créé des données dans la macro, la table locale n'est pas vide, le call symput va donc mettre ses variables dedans.

Pour les rendre globales, il me faudrait donc rajouter un %global quelque part, mais vu que les variables sont créées dans un call symput, est-ce que c'est possible ?
raf64flo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 11h59   #8
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
Un exemple pour définir des macros variables en global.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DATA t1;
input a b;
cards;
1 2
2 6
3 4
5 6
4 8
;
run;
%macro toto;
 
DATA _null_; SET t1;
call symputx('a'||LEFT(trim(_n_)),a,'G');
run;
%mend;
%toto;
%put _user_;
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 12h03   #9
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
L'option mprint n'est pas activer par defaut.
Pour l'activer au lancement de chaque session SAS, il faut faire la modif dans le fichier sasV8.cfg sasV9.cfg.

Cordialement.
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 12h05   #10
Membre du Club
 
Inscription : novembre 2007
Messages : 120
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 120
Points : 56
Points : 56
Rajouter ce 3e argument :
,'G'
au Call Symput ça permet de rendre les variables qu'il crée golables ?
raf64flo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 12h08   #11
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
symputx et non symput nouveatée de la SASV9, tu es sous v8?
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 12h42   #12
Membre du Club
 
Inscription : novembre 2007
Messages : 120
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 120
Points : 56
Points : 56
Non non, V9, mais je ne connaissais pas cette alternative.

Merci !
raf64flo 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 15h15.


 
 
 
 
Partenaires

Hébergement Web