IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macro Discussion :

Probleme macro variable dans un NOT IN


Sujet :

Macro

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 30
    Points : 23
    Points
    23
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    data zzzzz;
    set table;
    if AUTH not in (&ctry_list.) then output;
    run;
    voici mon LOG:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    %let longueur = %length(&ctry_list) ;
    %put &longueur ;
    LOG:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ;-)

  2. #2
    Invité
    Invité(e)
    Par défaut
    quelle version SAS utilises-tu?

  3. #3
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.;

  4. #4
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    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

  5. #5
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    C'est pas ce que je t'ai posté fpolo! bien vu pour le UPCASE Datametreec
    Essaies ça pour voire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  6. #6
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 30
    Points : 23
    Points
    23
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    25091  %put &longueur ;
    SYMBOLGEN:  Macro variable LONGUEUR resolves to 677
    677

  7. #7
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Points : 372
    Points
    372
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ;

  8. #8
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    Il me semble que le "IN" ne fonctionne pas avec un "IF".
    si ca marche . la preuve:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  9. #9
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    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.

  10. #10
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 30
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par MEGAMIND2 Voir le message
    Essaies ça pour voire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  11. #11
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    ah voila fpolo, c'était le message log clef!

    tapis sur les quotes.

    essaie ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DATA zzzzz;
    SET TABLE;
    IF AUTH NOT IN ('&ctry_list.') then output;
    run;

  12. #12
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Faudrait que tu définisses au préalable les parenthèses autour de ta macro!

  13. #13
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    Citation Envoyé par Manoutz Voir le message
    si ca marche . la preuve:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  14. #14
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 30
    Points : 23
    Points
    23
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?!

  15. #15
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329

  16. #16
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 à 20h36.

  17. #17
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    merci pour l'info bahraoui (je savais pas), mais je pense que ce soit un soucis ici. fpolo n'utilise pas les range.

  18. #18
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    ç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.

  19. #19
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    @ 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


  20. #20
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 30
    Points : 23
    Points
    23
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WARNING: The quoted string currently being processed has become more than 262 characters long.
             You may have unbalanced quotation marks.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Appel macro variable dans ODS
    Par l'breton du 29 dans le forum Macro
    Réponses: 2
    Dernier message: 27/06/2008, 11h30
  2. Réponses: 11
    Dernier message: 29/05/2008, 17h26
  3. Réponses: 0
    Dernier message: 28/05/2008, 16h15
  4. probleme de variable dans une boucle
    Par www.rubis dans le forum Linux
    Réponses: 2
    Dernier message: 04/09/2007, 17h06
  5. Réponses: 2
    Dernier message: 04/01/2004, 16h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo