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 26/01/2011, 16h32   #1
Invité régulier
 
paulo fred
Inscription : juillet 2010
Messages : 29
Détails du profil
Informations personnelles :
Nom : paulo fred

Informations forums :
Inscription : juillet 2010
Messages : 29
Points : 8
Points : 8
Par défaut Probleme macro variable dans un NOT IN

Bonjour a tous,

J'ai une liste de 226 codes a verifier dans un fichier de 66000000 de lignes.

Je recupere mes codes a tester :
Code :
1
2
3
4
proc sql noprint;
SELECT Country_name INTO: ctry_list separated BY ', '
FROM strucf.Country_list_wipo_sect3;
quit;

Puis j'extrais les codes qui ne correspondent pas à ma liste de valeurs que contient ma macro variable &ctry_list :
Code :
1
2
3
4
DATA zzzzz;
SET TABLE;
IF AUTH NOT IN (&ctry_list.) then output;
run;
voici mon LOG:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
49
49
5    ! 'SH', 'SI', 'SK', 'SL', 'SM', 'SN', 'SO', 'SR', 'ST', 'SV', 'SY', 'SZ', 'TC', 'TD', 'TG',
5    !  'TH', 'TJ', 'TL', 'TM', 'TN', 'TO', 'TR', 'TT', 'TV', 'TW', 'TZ', 'UA', 'UG',
NOTE: Line generated BY the macro variable "CTRY_LIST".
6       'US', 'UY', 'UZ', 'VA', 'VC', 'VE', 'VG', 'VN', 'VU', 'WO', 'WS', 'XN', 'YE', 'ZA',
           ----  ----  ----  ----  ----  ----  ----  ----  ----  ----        ----  ----  ----
----
           49    49    49    49    49    49    49    49    49    49          49    49    49
49
6    ! 'ZM', 'ZW
NOTE 49-169: 
The meaning of an identifier after a quoted string may change in a future SAS release.  Inserting white space between a quoted string and the succeeding identifier is recommended.
J'ai testé la longueur de ma macro var :
Code :
1
2
%let longueur = %length(&ctry_list) ;
%put &longueur ;
LOG:
Code :
1
2
3
25078  %put &longueur ;
SYMBOLGEN:  Macro variable LONGUEUR resolves TO 1352
1352
est ce qu'une macro vavriable est limitée en caractere ?

Connaissez vous une solution ?

merci d'avance ;-)
fpolo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 16h41   #2
Invité
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
quelle version SAS utilises-tu?
  Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 16h50   #3
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
Code :
1
2
3
%let test="dskjjjjjjjjjghfhjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjdddddddddddddddddddddddddddddddddddddddddddddjjjjjjjjjjjjjjjjjjjjjjjjjjjjjdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjffd";
 
%put &test.;
j'ai un avertissement dans la log (sas 9.2)disant que la chaine contient plus de 262 caractères, mais le rendu semble correct. Il me semble qu'on est limité 64000 caractère, à confirmer. tu peux déjà supprimer l'espace, tu réduira la longueur de bp.

mais la ou je vois un problème dans ton code, c'est que sépare les valeurs distinctres par des quotes, donc la première et la dernière n'est pas entre quotes. Et je dirais les autres également.

ca donne quoi

%put &ctry_list.;
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 16h53   #4
Membre Expert
 
Inscription : mars 2005
Messages : 1 010
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 010
Points : 1 258
Points : 1 258
Envoyer un message via Yahoo à bahraoui
Il me semble que le "IN" ne fonctionne pas avec un "IF". je ne sais pas très bien pour quelle version
je te conseille de faire un test avec deux éléments pour vérifier ça. si ça marche il faut voir combiens d'éléments tu peux mettre dans la liste du "IN".

Cordialement
Salah
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 16h59   #5
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
C'est pas ce que je t'ai posté fpolo! bien vu pour le UPCASE Datametreec
Essaies ça pour voire:

Code :
1
2
3
4
5
6
%LET ctry_list = %str(('SH', 'SI', 'SK' ,'SL', 'SM' ,'SN'));
 
DATA TEST1;
SET TEST2;
IF AUTH NOT IN &ctry_list. then output;
run;
Brice
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 17h03   #6
Invité régulier
 
paulo fred
Inscription : juillet 2010
Messages : 29
Détails du profil
Informations personnelles :
Nom : paulo fred

Informations forums :
Inscription : juillet 2010
Messages : 29
Points : 8
Points : 8
J'ai la version 9.2.

J'ai deja utilisé des if avec not in ca fonctionnait mais je tapais la liste complette.

J'ai supprimé l'espace dans le proc sql, mais j'ai toujours ce message :
Code :
1
2
ERROR 22-322: Syntax error, expecting one of the following: a quoted string,
              a numeric constant, a datetime constant, a missing value, iterator, (.ERROR 76-322: Syntax error, statement will be ignored.
%put &ctry_list.; :
Code :
1
2
3
25091  %put &longueur ;
SYMBOLGEN:  Macro variable LONGUEUR resolves TO 677
677
fpolo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 17h04   #7
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 hash

Salut,

les objets hash ont été développés pour répondre à ce genre de problème.

google: "site:sas.com filetype:pdf hash"


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
 
 
DATA Country_list_wipo_sect3;
input Country_name ;
cards ;
1
2
3
;
run;
 
DATA TABLE;
input AUTH var1 $;
cards ;
10 ligne1
8 ligne2
8 ligne3
1 ligne4
2 ligne5
3 ligne6
4 ligne7
5 ligne8
6 ligne9
;
run;
 
 
DATA zzzzzz;
dcl hash hh (dataset: 'work.Country_list_wipo_sect3 (rename=(Country_name=AUTH))', hashexp: 10) ;
hh.DefineKey ( 'AUTH' ) ;
hh.DefineDone () ;
do until ( eof2 ) ;
SET TABLE end = eof2 ;
	IF hh.find () ne 0 then output ;
end ;
stop ;
run ;
sasadm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 17h04   #8
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
Citation:
Il me semble que le "IN" ne fonctionne pas avec un "IF".
si ca marche . la preuve:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
DATA test;
input var $;
cards;
ffd
dd
kk
;
run;
 
DATA test2 test3;
SET test; 
IF var IN ("dd") then output test2;
IF var IN ("dd","ffd") then output test3;
run;
je relance la mise pour les quotes, regarder dans la proc sql ou dans l'étape data.
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 17h06   #9
Membre Expert
 
Inscription : mars 2005
Messages : 1 010
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 010
Points : 1 258
Points : 1 258
Envoyer un message via Yahoo à bahraoui
ajoute l'option "option mprint" pour voir le code générer et exécuter par SAS pour essayer de voir si il y a un problème de syntaxe.
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 17h07   #10
Invité régulier
 
paulo fred
Inscription : juillet 2010
Messages : 29
Détails du profil
Informations personnelles :
Nom : paulo fred

Informations forums :
Inscription : juillet 2010
Messages : 29
Points : 8
Points : 8
Citation:
Envoyé par MEGAMIND2 Voir le message
Essaies ça pour voire:

Code :
1
2
3
4
5
6
%LET ctry_list = %str(('SH', 'SI', 'SK' ,'SL', 'SM' ,'SN'));
 
DATA TEST1;
SET TEST2;
IF AUTH NOT IN &ctry_list. then output;
run;
Brice
J'ai essayé mais output toujours vide !
fpolo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 17h08   #11
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
ah voila fpolo, c'était le message log clef!

tapis sur les quotes.

essaie ca

Code :
1
2
3
4
DATA zzzzz;
SET TABLE;
IF AUTH NOT IN ('&ctry_list.') then output;
run;
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 17h11   #12
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
Faudrait que tu définisses au préalable les parenthèses autour de ta macro!
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 17h11   #13
Membre Expert
 
Inscription : mars 2005
Messages : 1 010
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 010
Points : 1 258
Points : 1 258
Envoyer un message via Yahoo à bahraoui
Citation:
Envoyé par Manoutz Voir le message
si ca marche . la preuve:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
DATA test;
input var $;
cards;
ffd
dd
kk
;
run;
 
DATA test2 test3;
SET test; 
IF var IN ("dd") then output test2;
IF var IN ("dd","ffd") then output test3;
run;
je relance la mise pour les quotes, regarder dans la proc sql ou dans l'étape data.
chez moi aussi ça marche aussi, ce que j'ai dit ça ne marche pas sur toute les version.
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 17h11   #14
Invité régulier
 
paulo fred
Inscription : juillet 2010
Messages : 29
Détails du profil
Informations personnelles :
Nom : paulo fred

Informations forums :
Inscription : juillet 2010
Messages : 29
Points : 8
Points : 8
Citation:
Envoyé par bahraoui Voir le message
ajoute l'option "option mprint" pour voir le code générer et exécuter par SAS pour essayer de voir si il y a un problème de syntaxe.
Voici le resultat :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
25147  options mprint mfile;
25148
25149  %LET ctry_list = %str(('CN', 'SI', 'SK' ,'SL', 'SM' ,'SN'));
25150
25151  DATA TEST1;
25152  SET Test_tls201_appln;
25153  IF AUTH_NOT IN &ctry_list. then output;
SYMBOLGEN:  Macro variable CTRY_LIST resolves TO ('CN', 'SI', 'SK' ,'SL', 'SM' ,'SN')
SYMBOLGEN:  Some characters IN the above value which were subject TO macro quoting have been
            unquoted FOR printing.
25154  run;
 
NOTE: Variable AUTH_NOT IS uninitialized.
NOTE: There were 10 observations READ FROM the DATA SET WORK.TEST_TLS201_APPLN.
NOTE: The DATA SET WORK.TEST1 has 0 observations AND 10 VARIABLES.
NOTE: DATA statement used (Total process time):
      real time           0.01 seconds
      cpu time            0.01 seconds
Apparemment ca devrait fonctionner ?!
fpolo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 17h13   #15
Membre Expert
 
Inscription : mars 2005
Messages : 1 010
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 010
Points : 1 258
Points : 1 258
Envoyer un message via Yahoo à bahraoui
http://support.sas.com/kb/13/533.html
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 17h15   #16
Invité
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Code :
1
2
3
4
DATA zzzzz;
SET TABLE;
IF AUTH NOT IN ('&ctry_list.') then output;
run;

ça marche avec simples quotes ? ce n'est pas une double quotes qu'il faut ?

Dernière modification par fafabzh6 ; 26/01/2011 à 19h36.
  Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 17h16   #17
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
merci pour l'info bahraoui (je savais pas), mais je pense que ce soit un soucis ici. fpolo n'utilise pas les range.
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 17h16   #18
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
ça se trouve ta condition n'est pas vérifiée, c'est pour ça que tu a 0 obs. Pour t'en assurer fais un proc freq sur ta variable.
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 17h19   #19
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
@ rose: oui ca marche. j'ai déjà codé comme ca. C'est notamment utile qd tu veux concatener des quotes à une chaine de caractères, comme

Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 17h20   #20
Invité régulier
 
paulo fred
Inscription : juillet 2010
Messages : 29
Détails du profil
Informations personnelles :
Nom : paulo fred

Informations forums :
Inscription : juillet 2010
Messages : 29
Points : 8
Points : 8
Citation:
Envoyé par MEGAMIND2 Voir le message
ça se trouve ta condition n'est pas vérifiée, c'est pour ça que tu a 0 obs. Pour t'en assurer fais un proc freq sur ta variable.
Je vais verifer ca.
Mon fichier est soit vide soit il contient toute les lignes du ficheir de depart.

Apparemment les macro var sont limitées :

Code :
1
2
WARNING: The quoted string currently being processed has become more than 262 characters long.
         You may have unbalanced quotation marks.
fpolo 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 04h38.


 
 
 
 
Partenaires

Hébergement Web