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

Débutez Discussion :

Noms des variables dans une boucle SAS


Sujet :

Débutez

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 45
    Points : 24
    Points
    24
    Par défaut Noms des variables dans une boucle SAS
    Bonjour;

    Peut on faire une boucle SAS et parcourir les variables tout en gardant leurs noms ? çad sans passer par array, sachant que les vaiables sont de cette forme: PDT SAT L11 BIT...
    Merci d'avance!!

  2. #2
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 625
    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 625
    Points : 3 403
    Points
    3 403
    Par défaut
    Parcourir? pour en faire quoi?

    tu peux récupérer tes variables des vues dictionary (columns)SAS et tu fais ta boucle par la suite, sinon une proc contents tu récupères tes variables et tu dais une étape data _null_ avec un call symput.
    Tu trouvera pleins PLEINS de topic dans le forum sur ce sujet.
    et si tu veux qu'on t'aide, essaies de détailler un peu plus ton besoin.

  3. #3
    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 répond peut être à ton problème

    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
    PROC CONTENTS DATA =SASHELP.SHOES OUT=OUT;
    RUN;
     
    PROC SQL;
    	SELECT NAME INTO: NAME SEPARATED BY " " FROM OUT;
    	SELECT COUNT(*) INTO: loop  FROM OUT;
    QUIT;
     
    %MACRO IMFAFA;
    	%DO i_=1 %TO &loop.;
    		%LET extract&i_.=%SCAN(&NAME.,&i_.," ");
    		%PUT extract&i_.=&&extract&i_.;
    	%END;
    %MEND IMFAFA;
     
    %IMFAFA;

    Par contre si tu as déjà ta liste de variables définies au préalable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    %LET NAME=PDT SAT L11 BIT;
     
    %MACRO IMFAFA;
    	%DO i_=1 %TO 4;
    		%LET extract&i_.=%SCAN(&NAME.,&i_.," ");
    		%PUT extract&i_.=&&extract&i_.;
    	%END;
    %MEND IMFAFA;
     
    %IMFAFA;

  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    J'ai essayé ta solution Brice, l'erreur suivant se produit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ERROR: The text expression length (146689) exceeds maximum length (65534). The text expression has
           been truncated to 65534 characters.

  5. #5
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 625
    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 625
    Points : 3 403
    Points
    3 403
    Par défaut
    Bonjour,
    c'est surement du à la taille de la macro variable qui ne dois malheureusement pas depassé 65534 .
    il faut découper ta macro variable. Genre faire deux boucles.
    Mais si tu parvient ton étape qui bloque on pourra peut être t'aider.

  6. #6
    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,
    Le fameux problème de taille ne se poserai plus avec ceci:

    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
    PROC CONTENTS DATA =SASHELP.SHOES OUT=OUT;
    RUN;
     
    DATA _NULL_;
    	SET OUT END=EOF;
    	CALL SYMPUT("extract"||LEFT(_N_),NAME);
    	IF EOF THEN CALL SYMPUT("loop",_N_);
    RUN;
     
    %MACRO IMFAFA;
    	%DO i_=1 %TO &loop.;
    				%PUT extract&i_.=&&extract&i_.;
    	%END;
    %MEND IMFAFA;
     
    %IMFAFA;
    Bonne journée!

  7. #7
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Et pourquoi pas avec un array ? Pourquoi t'imposer cette contrainte ?
    Reste aussi la solution d'une transposition puis d'un BY comme proposé ici : le problème de départ semblait voisin (trop de variables pour stocker leurs noms dans une seule macro-variable).
    D'ailleurs la demande nous venait déjà de toi et tu butais déjà sur la même limite ; Sébastien et Brice t'avaient proposé des solutions de contournement.
    En quoi le souci est-il différent ?

  8. #8
    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
    La seule différence avec ce poste c'est juste une division de toutes les lignes par la première, c'est peut être ça qui l'a perturbé .
    Il m'a eu et Sam aussi

  9. #9
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 625
    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 625
    Points : 3 403
    Points
    3 403
    Par défaut
    Citation Envoyé par MEGAMIND2 Voir le message
    La seule différence avec ce poste c'est juste une division de toutes les lignes par la première, c'est peut être ça qui l'a perturbé .
    Il m'a eu et Sam aussi
    moi je voulais qu'il détaille un peu plus ce qu'il veut faire car il se peut qu'on est à coté de la plaque par rapport à son besoin. Mais bon...

  10. #10
    Membre à l'essai
    Inscrit en
    Mars 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par olivier.decourt Voir le message
    e problème de départ semblait voisin.
    D'ailleurs la demande nous venait déjà de toi et tu butais déjà sur la même limite ; Sébastien et Brice t'avaient proposé des solutions de contournement.
    ICI j'ai pas posé le problème de limite, c'etait just erreur de la solution de Brice.
    Mais même dans la discussion que tu rappeles j'ai rencontré le même probleme des noms de variables.
    je t'explique: lorsqu' j'ai fait:

    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
    data T;
    input   PDT SAT L11 BIT SII;
    cards;
     11  5  10  15  8  17
     6   12 3   12  3  2
    ;
    run;
    PROC IML;
    USE T;READ ALL INTO X;PRINT x;
    CREATE array_T FROM X;APPEND FROM X;
    CLOSE array_T;QUIT;
     
    %macro DOC();
    %do i=1 %to 5;
    data T2; 
    set T2;
    set array_T (keep=COL&i);
    if COL&i > 10 then n&i = 1/COL&i; 
    else n&i=".";
    run;
    %end;
    %mend;
    %DOC();
    la sortie de T2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    date	COL1	n1	COL2	n2	COL3	n3	COL4	n4	COL5	n5
    	11	0.0909090909	5		10		15	0.0666666667	8	
    	6		12	0.0833333333	3		12	0.0833333333	3
    ; la perte des noms initiales de la table m'a perturbé .
    Mais j'ai rappelé une idée de la part de Brice comme b'hab mais dans une autre discussion: c'etait lidée d'ajouter une autre variable par exemple CLE=1 et puis MERGE les deux tables, et ça marche bien !!,
    Prochainement avant de poser mes questions je consulterais toutes les reponses reçues
    Merci .

  11. #11
    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
    Ne pose pas trop de questions sinon tu passeras plus de temps à chercher

  12. #12
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour Imfafa.
    Dois-je déduire de ton dernier message que finalement ce topic est résolu ?

    Par ailleurs, comme tu nous soumets du code, je dois te dire que je suis assez surpris par ta proc IML : elle ne fait qu'une copie de la table existante, non ? Et en plus tu perds les noms de colonnes, ce qui semble t'être un problème par la suite.
    Tu peux faire une copie conforme de la table avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DATA array_T ; SET t ; RUN ;
    tu conserveras tes noms de variables initiaux. Si tu veux les renommer automatiquement, le plus simple serait encore... de transposer, une fois encore ! (sinon il y aura des macros à rédiger)

    Une dernière chose sur ton macro-programme. Tu fais 5 boucles (et si je me souviens bien, dans ton vrai jeu de données, il y a plusieurs milliers de variables, pas juste 5) et 5 étapes DATA. En déplaçant la boucle, on peut tout faire en une seule lecture de table.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    %macro DOC();
    DATA T2; 
    SET T2;
    SET array_T (keep=COL&i);
    %do i=1 %TO 5;
    IF COL&i > 10 then n&i = 1/COL&i; 
    else n&i=".";
    %end;
    run;
    %mend;
    Bon courage.
    Olivier

  13. #13
    Membre à l'essai
    Inscrit en
    Mars 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    Bonjour;
    J'ai fait proc IML just pour renommer automatiquement les variables; parce que je sais pas faire une boucle si j'ai pas un compteur çad en gardant les noms intiales. c' est pour cette raison etait cette question.

    Et bien évidement ma table contient des milliers de variables, mais just j'ai essayé avec un echantillon pour tester.

    @Brice: j'aime le conseil, mais si tu remontes un peu tu verra que je l'ai deja dit .

  14. #14
    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
    Je faisais allusion à ce méssage !
    C'est pour te dire qu'au bout d'un certain temps passé sur ce forum (si t'es actif bien sûr), c'est relativement difficile de retrouver la solution à un problème précis. c'etait de l'humour!
    Voilà, voilou!!!

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

Discussions similaires

  1. Attribuer des noms de variables dans une boucle
    Par sanguisorbe dans le forum Langage
    Réponses: 8
    Dernier message: 13/06/2014, 15h42
  2. changer le nom des variables dans une boucle
    Par bakaratoun dans le forum MATLAB
    Réponses: 3
    Dernier message: 05/02/2010, 13h50
  3. [MySQL] Des noms de variables dans une boucle
    Par nicolas2603 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 25/08/2009, 14h51
  4. Nom de variable dans une boucle
    Par Invité dans le forum Langage
    Réponses: 2
    Dernier message: 16/05/2008, 16h24
  5. Afectation des variables dans une boucle
    Par Yoni Lebene dans le forum Delphi
    Réponses: 3
    Dernier message: 05/01/2007, 18h52

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