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 :

macrovariable composée de noms de macrovariables


Sujet :

Macro

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 147
    Points : 58
    Points
    58
    Par défaut macrovariable composée de noms de macrovariables
    Bonjour à tous,

    Je cherche à réaliser une proc corr avec une graaaaaande liste de variables (environ 23 000).
    Cette liste de variables est disponible dans une table "tmp" issue d'un proc contents et j'aimerais placer cette liste dans ma proc corr.
    Etant donné le nombre de variables ainsi que le nom de chacune d'elles (en moyenne, une variable a 18 caractères), je suis obligée de décomposer ma liste de variables en plusieurs macrovariables pour ne pas dépasser la limite autorisée...


    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    proc contents data=test4 out=tmp noprint; run;
     
    /*Ajout de double quotes pour construire une liste pour la suite*/
    data tmp;
    set tmp;
    NAME2=cats("""",NAME,"""");
    run;
     
    %let vide=;
    %macro test();
        /*Comptage du nombre de lignes dans ma table tmp*/
    	proc sql;
    		select count(*) into : vide from tmp;
    	quit;
    	%let i=1;
        /*varlist : Macrovariable finale*/
    	%let varlist="";
     
    	/*Chargement des variables*/
    	%do %while (&vide>=1);
    		proc sql noprint;
    			%let varlist&i=;
    			select distinct name2 into : varlist&i separated by " " 
    			from tmp
    			where monotonic()<=3250;
     
    			delete * from tmp where name in (&&varlist&i);
     
    			select count(*) into : vide from tmp;
    		quit;
     
     
    		*%put varlist&i= &&varlist&i;
    		%let varlist&i=%sysfunc(compress(&&varlist&i,%str(%")));
     
    /*ICI LE COEUR DU PROBLEME*/
    	/*Création de la liste pour la proc corr*/
    		%if (&i=1) %then
    			%let varlist='varlist1';
    		%else %let varlist = &varlist /'&varlist'&i;
     
    		*%put VARLIST : &varlist;
     
    		%let i=%eval(&i+1);
    	%end;
     
    	%let varlist=%qsysfunc(tranwrd(&varlist, %str(%/'),%str(% ) )); /*Remplacement des /' par un espace*/
    	%let varlist=%qsysfunc(tranwrd(&varlist, %str(%' ),"")); /*Remplacement des quotes seuls par une chaine vide*/
    	%put varlist : &varlist;
     
    /*FIN PROBLEME*/
     
    	/*Lancement de la proc corr*/
    	/*proc corr data=Test4;
    		var &varlist;
    	run;*/
    %mend;
    %test();
    Le problème est que je souhaiterai créer ma variable varlist = &varlist1 &varlist2 ... &varlistN de sorte qu'une fois cette varlist créée, je puisse l'utiliser dans ma proc corr.
    Cependant, tout ce que j'ai testé ne fonctionne pas ou me fait dépasser la taille autorisée par les macrovariables.

    J'espère avoir été claire.
    Merci d'avance pour l'aide que vous pourrez m'apporter.

  2. #2
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 1 624
    Points : 3 402
    Points
    3 402
    Par défaut
    Hello;
    Et oui la longueur des macro variables dans SAS sont limitées à 65534 caractères.
    Tu peux contourner le problème avec la routine Call symput + une boucle dans un macro programme.
    je te propose cet exemple et essaies de l'adapter à ton besoin:
    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
     
     
     
    proc contents data=sashelp.class out= list (keep=name) noprint;run;
     
    data _null_;
    	set list;
    	call symput ('nbr', _n_ );
    	call symput (cats('var',_n_), name);
    run;
     
    %macro select_var;
     
    	data finale ;
    	set sashelp.class;
    	keep %do i=1 %to %eval(&nbr. -2);&&var&i %end;;
    	run;
     
    %mend;
     
    %select_var;
    N'oubliez pas de consulter les FAQ SAS et les cours et tutoriels SAS
    N'oubliez pas de mettre votre message à si la solution donnée résout votre problème

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 147
    Points : 58
    Points
    58
    Par défaut
    Bien reçu! Je vais faire une tentative! Merci

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 147
    Points : 58
    Points
    58
    Par défaut
    J'ai testé ça comme ça :

    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
    %macro t ();
    proc contents data=test4 out=tmp noprint; run;
     
    data _null_;
    set tmp;
    call symput('nbr', _n_);
    call symput(cats('var',_n_), name);
    run;
    %put var5 : &var5;
    %put var1 : &var1;
     
    proc corr data=test4;
    var %do i=1 %to %eval(&nbr.);
    	&&var&i %end;;
    run;
     
    %mend;
    %t;
    La première étape avec les call symput fonctionne nickel. Au lieu d'avoir N listes de variables, j'ai 23000 macrovariables
    Par contre j'ai tenté de faire une boucle dans le "var" du proc corr et SAS a arrêté mon traitement, sans plus d'explications.

    J'ai tenté une autre technique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    proc corr data=scoreL.test4;
    var &var1. - &var&nbr. ; 
    run;
    Ce n'est pas plus fructueux... :
    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
    var5 : T100TOP
    var1 : G0
    WARNING: Référence symbolique apparente VAR non traitée.
    NOTE: Ligne générée par la macro appelée "T".
    45                                                       &var&nbr.; run;
                                                             _
                                                             22
                                                             200
    ERROR: Variable NAME introuvable.
     
    ERROR 22-322: Erreur de syntaxe ; syntaxe requise : un nom, -, CHAR, CHARACTER, NUMERIC.  
     
    ERROR 200-322: Le symbole n'est pas reconnu et sera ignoré.
     
    NOTE: Le Système SAS a interrompu le traitement de cette étape en raison d'erreurs.
    Aurais-je oublié qqch?

  5. #5
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    Bonjour


    &&var&n plutôt ?

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 147
    Points : 58
    Points
    58
    Par défaut
    Bonjour,

    J'avais essayé mais idem :

    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
    ERROR: Le Système SAS a interrompu le traitement de cette étape
    NOTE: Procédure CORR a utilisé (Durée totale du traitement) :
          temps réel          2.73 secondes
          temps UC            2.73 secondes
     
    NOTE: Ligne générée par la variable macro "NBR".
    45          &var
                _
                22
                200
    WARNING: Référence symbolique apparente VAR non traitée.
    ERROR: Variable NAME introuvable.
     
    ERROR 22-322: Erreur de syntaxe ; syntaxe requise : un nom, -, CHAR, CHARACTER, NUMERIC.  
     
    ERROR 200-322: Le symbole n'est pas reconnu et sera ignoré.

  7. #7
    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
    Bonjour,
    C'est normal que ça ne marche pas car chaque macro-variable représente une variable, et donc &var1-&&var&nbr n'est pas reconnu. Je pense que t'as pas le choix que de passer par une liste.

  8. #8
    Membre éclairé

    Femme Profil pro
    SAS FRANCE - Support Clients France et Europe
    Inscrit en
    Février 2010
    Messages
    289
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : SAS FRANCE - Support Clients France et Europe
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 289
    Points : 886
    Points
    886
    Par défaut
    Bonjour,

    la solution c'est le call execute : au lieu de créer une liste en macro-variable, on écrit la proc corr en lisant la table contenant la liste des valeurs. L'avantage est de ne pas avoir de contraintes à cause de la longueur de l'instruction.

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    proc sql noprint;
    	create table DATA1 as
    	SELECT DISTINCT name2 
    	FROM tmp 
    	WHERE monotonic()<=3250;
    quit;
     
     data _null_ ;
       set DATA1 end=last;
       if _n_=1 then call execute ('proc corr data=test4; var ') ;
       call execute (name2) ;
       if last then call execute (' ;run; ') ;
     run ;
    Un article expliquant cette fonction bien pratique : Allo Support 14 .

    Cordialement,
    Géraldine Cade-Deschamps
    Support Clients SAS
    Cordialement,

    --
    Géraldine CADE-DESCHAMPS
    Consultante ▪ Support Clients SAS
    Tel: +33 1 60 62 12 12 ▪ support@sas.com
    www.sas.com/france
    SAS® … THE POWER TO KNOW®

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 147
    Points : 58
    Points
    58
    Par défaut
    Merci Géraldine,

    La création du proc corr fonctionne sans problème!
    Je n'ai qu'à régler un petit souci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ERROR: Le Système SAS a interrompu le traitement de cette étape
    Mais en dehors de cela, la proc corr s'est bien faite vu l'écriture de la work, merci!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. composant tRunJob : nom du job en paramètre
    Par jeanphi45 dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 17/03/2010, 13h10
  2. Réponses: 0
    Dernier message: 26/05/2009, 15h08
  3. [JTextField] Nom du composant
    Par Mister Nono dans le forum Composants
    Réponses: 3
    Dernier message: 07/01/2005, 09h36
  4. [FLASH MX] Nom de composant dynamique
    Par bobgeldof7 dans le forum Flash
    Réponses: 2
    Dernier message: 12/11/2004, 23h07
  5. [ActionEvent] Récupérer nom du composant émetteur
    Par mouloude dans le forum Composants
    Réponses: 4
    Dernier message: 29/10/2004, 17h19

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