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 :

Boucle pour obtenir plusieurs macro variables


Sujet :

Macro

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 27
    Points : 19
    Points
    19
    Par défaut Boucle pour obtenir plusieurs macro variables
    Bonjour,

    J'ai besoin d'aide j'essaye de faire une boucle pour obtenir plusieurs macro variables mais je n'y arrive pas et je ne comprends pas pourquoi...

    Voilà mes données, j'ai un fichier ou &max_col.= 70 et &max_obs.= 1020 et des colonnes de pos1 à pos70 avec par exemple pos1 contient
    pos1
    1 val1
    2 val1
    3 val2
    4 val1
    .....
    1020 val3

    Je souhaiterai créer autant de macro variables que je n'ai de ligne et de colonne contenant la position du val

    J'ai essayé de faire ceci mais ça ne fonctionne pas:
    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
     
    %macro test;
    data _null_;
    set ga_sepa_test;
    where val1='QRBA02';
    	%do i = 1 %to &max_col.; 
    		%do l = 1 %to &max_obs.; 
    	 		call symput("col&i._&l.",cats("val",pos&i.)); 
    		%end; 
    	%end; 
    run;
    %mend; 
    %test;
     
    %put &col1_1.;
    Le %put doit me donner val1.

    Voilà mon problème merci pour votre aide

  2. #2
    Membre actif
    Homme Profil pro
    KEYRUS - Chef de projet
    Inscrit en
    Avril 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : KEYRUS - Chef de projet

    Informations forums :
    Inscription : Avril 2014
    Messages : 45
    Points : 277
    Points
    277
    Par défaut
    Bonjour,

    Tu es dans une étape data donc pas besoin de ta seconde boucle.
    Le datasets est une boucle implicite.

    De plus, si tu mets ton %put à l'extérieur de ton macro programme, tu ne pourras pas résoudre la macro variable.
    Avec un call symput, ta macro variable est locale.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    %macro test;
    data _null_;
       set toto;
       %do i = 1 %to &max_col.; 
          call symput(compress("col&i._" !! put(_N_,best.)),pos1); 
       %end; 
    run;
    %put COL = &col1_1;
    %mend; 
    %test; 
     
    %put &col1_1.;

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Merci beaucoup !!!!

    J'ai un peu modifié le code pour l'avoir en global et ça marche comme je le voulais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    call symputx(compress("col&i._" !! put(_N_,best.)),pos&i.,"G");

  4. #4
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Petite question supplémentaire:

    Maintenant que j'ai mes macro variables avec pour chaque ligne et colonne, j'aimerai remplir ma table ligne par ligne et colonne par colonne, voici le code que j'ai fait pour illustrer mon 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
     
    /* macro variable contenant le nom des colonne ex: nom_col1 = module */
    data _null_;
       set ref_label_module;
       call symput (cats('nom_col',put(_N_,best.)),strip(nom_colonne));
    run;
     
    %put &nom_col1.;
     
    %macro test;
    data final (drop= key: val: pos:);
    set test;
    	%do i=1 %to &max_col.;
    			%do j=1 %to &max_obs.;
    		             &&nom_col&i.= &&col&i._&j. ;		
    	%end;	%end;
    run;
    %mend test;
    %test;
    J'ai testé ça ne fonctionne pas mais concrètement j'ai ceci
    pos1
    1 val1
    2 val1
    3 val2
    4 val1
    .....
    1020 val3

    je voudrais que la colonne module (=&nom_col1) à la ligne 1 soit égal à la valeur de val1 (=A)
    à la ligne 2 soit égal à la valeur de val1 (=A)
    à la ligne 3 soit égal à la valeur de val2 (=B)
    à la ligne 1020 soit égal à la valeur de val3 (=C)


    Mon code actuel boucle bien mais quand il arrive à la dernière ligne (1020) il remplace toute la colonne module par la valeur de val3 donc "C".

    J'espère être assez claire

  5. #5
    Membre actif
    Homme Profil pro
    KEYRUS - Chef de projet
    Inscrit en
    Avril 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : KEYRUS - Chef de projet

    Informations forums :
    Inscription : Avril 2014
    Messages : 45
    Points : 277
    Points
    277
    Par défaut
    Je n'ai rien compris...

    Sauf la dernière phrase, ajoute un "output".

    Tu es en macro langage donc SAS va exécuter tes 2 boucles pour chacune des lignes de ta table.
    A la dernière boucle, il va exécuter le run et copier le résultat dans ta table de sortie.

    Je ne comprends pas ce que tu veux faire mais cela me semble un peu tordu...

  6. #6
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Oui c'est tordu .. en fait je dois réaliser une transposé d'une table qui n'a pas de structure logique, par exemple:

    key1 val1 key2 val2 key3 val3 key4 val4
    module a date 19/11/2014 heure 09:01:25 nb 1
    module b heure 19:01:25 date 19/11/2014 nb 2
    module c date 18/11/2014 heure 09:01:25
    module d heure 09:01:25 nb 5 code 120

    et je dois obtenir :
    module date heure nb code
    a 19/11/2014 09:01:25 1
    b 19/11/2014 19:01:25 2
    c 18/11/2014 09:01:25
    d 09:01:25 5 120


    j'ai pensé qu'en créant des macro variables pour chaque ligne et colonne je m'en sortirai ...

  7. #7
    Membre actif
    Homme Profil pro
    KEYRUS - Chef de projet
    Inscrit en
    Avril 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : KEYRUS - Chef de projet

    Informations forums :
    Inscription : Avril 2014
    Messages : 45
    Points : 277
    Points
    277
    Par défaut
    Je n'aurais pas traité le problème en macro langage...

    1ère étape : créer une table avec uniquement KEY et VAL
    2e étape : Transposition

    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
    data titi(keep=id_ligne val key);
    set toto;
    id_ligne = _N_;
    key = key1;
    val= val1;
    output;
    key = key2;
    val= val2;
    output;
    key = key3;
    val= val3;
    output;
    key = key4;
    val= val4;
    output;
    run;
     
    proc transpose data=titi out=tutu(drop=_NAME_ ID_LIGNE);
    by id_ligne;
    id key;
    var val;
    run;

  8. #8
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    J'ai perdu beaucoup de temps à chercher quelque chose de compliqué ... et ta solution est très simple ...

    merci

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

Discussions similaires

  1. [XL-2010] Macro boucle pour synthetiser plusieurs feuilles de calcul
    Par missalias dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 19/04/2015, 19h00
  2. Réponses: 10
    Dernier message: 01/03/2010, 17h06
  3. [PHP 5.0] Faire une boucle pour des noms de variable
    Par lonyc dans le forum Langage
    Réponses: 2
    Dernier message: 09/12/2009, 17h19
  4. [GD] Problème de boucle pour redimensionner plusieurs images ...
    Par jimmyneutron dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 10/04/2007, 17h46
  5. [ImageMagick] Boucle pour créer plusieurs images
    Par zimotep dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 10/01/2006, 21h44

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