Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Débutez
Débutez Forum concentrant les premières questions que l'on se pose en tant que débutant
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/05/2011, 21h00   #1
Invité régulier
 
Inscription : mars 2011
Messages : 45
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 45
Points : 7
Points : 7
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!!
Imfafa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 22h34   #2
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

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

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
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.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 22h52   #3
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
ça répond peut être à ton problème

Code :
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 :
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;
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 00h57   #4
Invité régulier
 
Inscription : mars 2011
Messages : 45
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 45
Points : 7
Points : 7
J'ai essayé ta solution Brice, l'erreur suivant se produit :

Code :
1
2
ERROR: The text expression length (146689) exceeds maximum length (65534). The text expression has
       been truncated TO 65534 characters.
Imfafa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 09h05   #5
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

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

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
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.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 09h34   #6
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Bonjour,
Le fameux problème de taille ne se poserai plus avec ceci:

Code :
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!
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/05/2011, 09h37   #7
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
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 ?
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 09h43   #8
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
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
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 10h00   #9
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

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

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
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...
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 12h53   #10
Invité régulier
 
Inscription : mars 2011
Messages : 45
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 45
Points : 7
Points : 7
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 :
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 :
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 .
Imfafa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 13h10   #11
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Ne pose pas trop de questions sinon tu passeras plus de temps à chercher
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 13h13   #12
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
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 :
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 :
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
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 13h33   #13
Invité régulier
 
Inscription : mars 2011
Messages : 45
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 45
Points : 7
Points : 7
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 .
Imfafa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 13h42   #14
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
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!!!
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h18.


 
 
 
 
Partenaires

Hébergement Web