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!!
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!!
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.
ç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;
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.
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.
Bonjour,
Le fameux problème de taille ne se poserai plus avec ceci:
Bonne journé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 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;
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 ?
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
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:
la sortie de T2:
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 perte des noms initiales de la table m'a perturbé .
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
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 .
Ne pose pas trop de questions sinon tu passeras plus de temps à chercher
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
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)
Code : Sélectionner tout - Visualiser dans une fenêtre à part DATA array_T ; SET t ; RUN ;
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.
Bon courage.
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;
Olivier
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 .
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!!!
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager