Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Macro
Macro Forum d'entraide sur le langage Macro de SAS
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 16/06/2011, 14h49   #1
Membre habitué
 
Homme Julien
Ingénieur d'études / Biostatisticien
Inscription : décembre 2009
Messages : 304
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : France

Informations professionnelles :
Activité : Ingénieur d'études / Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : décembre 2009
Messages : 304
Points : 101
Points : 101
Par défaut Concaténer colonne d'une table en conservant le format

Bonjour, j'ai une table remplie de valeurs numériques auquel j'applique un format afin de remplacer les numéros par les noms correspondant.

EX ,Table initial :
Citation:
1 1 1
1 1 2
1 2 3
Table final:
Citation:
a a a
a a b
a b c
Mon souci c'est quand je cherche à concaténer mes différentes colonnes pour n'en faire plus qu'une, je fais la syntaxe suivante donc:

Code :
1
2
3
4
5
 
DATA TEST;
SET TEST;
LIST = var1!!var2!!var3;
RUN;
la colonne LIST contient bien les fusions correctes mais je n'ai plus les noms mais les numéros associés du début... pour reprendre mon exemple, au lien d'avoir (les espaces sont omis exprés):

j'ai:
comment puis-je faire cette concaténation tout en conservant les noms?

Enfin, est-ce que si j'applique un CALL SYMPUT sur l'une des lignes de ma colonne LIST je peux me servir de cette liste de noms dans un %SCAN pour récupérer les noms de colonnes qui m'interesse?

En vous remerciant pour le temps accordé à ma question
joyeux_lapin13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 15h07   #2
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
à mon avis tu dois définir un nouveau format, sinon tu recodes tes variables (if var=1 then var2="a") avant de concatener.
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 15h15   #3
Candidat au titre de Membre du Club
 
Inscription : mars 2009
Messages : 34
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mars 2009
Messages : 34
Points : 13
Points : 13
Une possibilité serait de concaténer les variables après qu'elles aient été formatées. Le bémol, on perdra ainsi les informations de la variable non formatée.

La mise en oeuvre :

Code :
LIST = put(var1,nomduformat.)!!put(var2,nomduformat.)!!put(var3,nomduformat.);
Et pour être totalement complet, on utilisera les fonctions compress, trim, left, compbl en fonction de ce que l'on veut faire des "blancs" et on n'oubliera pas l'attrib de la variable LIST en caractères de la bonne longueur...

Bon code ;-)
Bunzy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 15h27   #4
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
Hello,
si t'es en SAS 9.2 ( je ne sais pas si c'est valable pour 9.1)

t'as les fonctions de concaténation .
cats, catt, catx,cat....
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 15h34   #5
Membre habitué
 
Homme Julien
Ingénieur d'études / Biostatisticien
Inscription : décembre 2009
Messages : 304
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : France

Informations professionnelles :
Activité : Ingénieur d'études / Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : décembre 2009
Messages : 304
Points : 101
Points : 101
Malheureusement pour moi S_a_m, catx ne semble pas conserver le format sur les exemples que j'ai trouvé...

Mais heureusement la syntaxe de Bunzy répond à mon problème! Par contre si je veux automatiser le machin sous cette forme:

Code :
1
2
3
4
5
6
7
8
 
DATA TEST;
SET TEST;
LIST = '';
%DO save = 1 %TO &nb_var.;
	LIST = LIST!!put(var&save.,var.);
%END;
RUN;
Pourquoi ça marche pas?
joyeux_lapin13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 15h40   #6
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
Les fonctions que je t'ai proposé remplacent ça (!! +trim, left, compbl ).
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 15h43   #7
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 joyeux_lapin13 Voir le message
Malheureusement pour moi S_a_m, catx ne semble pas conserver le format sur les exemples que j'ai trouvé...

Mais heureusement la syntaxe de Bunzy répond à mon problème! Par contre si je veux automatiser le machin sous cette forme:

Code :
1
2
3
4
5
6
7
8
 
DATA TEST;
SET TEST;
LIST = '';
%DO save = 1 %TO &nb_var.;
	LIST = LIST!!put(var&save.,var.);
%END;
RUN;
Pourquoi ça marche pas?
je n'ai pas compris ce que tu veux faire , pk list=''?
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 15h48   #8
Membre habitué
 
Homme Julien
Ingénieur d'études / Biostatisticien
Inscription : décembre 2009
Messages : 304
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : France

Informations professionnelles :
Activité : Ingénieur d'études / Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : décembre 2009
Messages : 304
Points : 101
Points : 101
Euh en fait c'était pour initialiser la cellule... mais là apparemment ça à l'air de marcher, j'attends d'en être sur pour cloturer mon topic.

A la base quand je faisais la syntaxe ci-dessus, il me renvoyait une colonne LIST remplit de ., donc je me suis demandé s'il fallait pas initialiser avant de concaténer les colonnes.
joyeux_lapin13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 15h56   #9
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
Il te manquerait pas un retain de Liste?
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 21h09   #10
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
Non pas de RETAIN car c'est calculé par observation.
Par contre plutôt qu'une boucle macro, un petit ARRAY (aux stands).
Code :
1
2
3
4
5
6
7
8
DATA TEST;
SET TEST;
LENGTH liste $ 32000 ; /* sert à initialiser et évite de perdre des bouts faute de place */
ARRAY mesVar var: ; /* VAR: toutes les variables dont le nom commence par "VAR" */
DO OVER mesVar ;
	LIST = CATX("/",LIST,put(mesVar,var.)) ;
END;
RUN;
Citation:
Enfin, est-ce que si j'applique un CALL SYMPUT sur l'une des lignes de ma colonne LIST je peux me servir de cette liste de noms dans un %SCAN pour récupérer les noms de colonnes qui m'interesse?
Ben justement, si tu veux pouvoir redécouper facilement avec %SCAN, il faut que tu te laisses un délimiteur entre les valeurs concaténées. C'est ce que fait CATX (ici le séparateur sera un /).
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 17h14   #11
Membre habitué
 
Homme Julien
Ingénieur d'études / Biostatisticien
Inscription : décembre 2009
Messages : 304
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : France

Informations professionnelles :
Activité : Ingénieur d'études / Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : décembre 2009
Messages : 304
Points : 101
Points : 101
Ah oé... c'est quand même plus sexy que le code que j'ai bricolé:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
DATA TEST;
SET TEST;
LIST1 = put(var1,var.);
%DO save = 2 %TO &TAILLE_COMBI.;
	%LET save_moins_un = %EVAL(&save. - 1);
	LIST&save. = LIST&save_moins_un.!!put(var&save.,var.);
%END;
LIST = LIST&TAILLE_COMBI.;
DROP var1 -- var&TAILLE_COMBI.;
DROP LIST1 -- LIST&TAILLE_COMBI.;
RUN;


Merci Bunzy, Brice, S_a_m et Olivier!
joyeux_lapin13 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 19h11.


 
 
 
 
Partenaires

Hébergement Web