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 05/07/2011, 15h35   #1
Invité de passage
 
Femme
Étudiant
Inscription : juillet 2011
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Canada

Informations professionnelles :
Activité : Étudiant
Secteur : Associations - ONG

Informations forums :
Inscription : juillet 2011
Messages : 12
Points : 0
Points : 0
Par défaut renommer des variables avec sas

Bonjour
Je suis une novice et suis confrontée à un problème qu'est ce lui de renommer des variables, je m'explique : je suis entrain d'écrire une macro qui fait des jointures entre des tables, cependant après chaque jointure je voudrais changer le nom des variables et ce à chaque fois que le jointure est effectuée.
merci pour votre aide.
loubna181 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 15h41   #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
Salut,
C'est trop vague tes explications, pourrais-tu être plus précis(e) que ça?
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 16h12   #3
Invité de passage
 
Femme
Étudiant
Inscription : juillet 2011
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Canada

Informations professionnelles :
Activité : Étudiant
Secteur : Associations - ONG

Informations forums :
Inscription : juillet 2011
Messages : 12
Points : 0
Points : 0
ok je vais expliquer plus.
j'ai une table principale qui contient une variable date qui selon elle je vais chercher 30 autres tables (c'est à dire 30 jours plus tot), mais à ce moment je dois renommer les variables de la table j-1 en leur mettant toutes -1 et pour celles de la table j-2 je dois mettre -2, car tous simplement ce sont des tables journalières avec le meme nom de variables. le -1, -2,-3...-30 me permettra de les differencier. j'Espere que je suis arrivée à meiux vous expliquer
merci bcp
loubna181 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 16h20   #4
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
Tu arrives à renommer une variable en -1, -2 ?
Tu peux pas poster un échantillon des deux tables que tu veux fusionner et le code que tu as commencé? ça permettrait de comprendre plus facilement
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 16h29   #5
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
Si tu as réussi à faire la jointure de la table principale avec j-2 sans utiliser une macro, c'est ce code qu'il faut poster ainsi qu'un échantillon des deux tables
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 16h46   #6
Invité de passage
 
Femme
Étudiant
Inscription : juillet 2011
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Canada

Informations professionnelles :
Activité : Étudiant
Secteur : Associations - ONG

Informations forums :
Inscription : juillet 2011
Messages : 12
Points : 0
Points : 0
je ne suis pas certaine de pouvoir poster un echantillon de mes tables....et je ne suis pas même pas arrivée à faire avec -1 ou -2....mais je peux mieux expliquer : au fait ma table principale contient la variable date et les tables que je vais chercher s'Appellent : table_journaliere_date, donc ma macro variable est la date et c'est elle qui me permet de connaitre les tables que je vais chercher pour les joindre. je suis entrain de travailler sur le code de cette macro je le posterais dès qu'il aura de l'allure.....je ne suis pas une prof..j'apprend et c'Est tellement dure
loubna181 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 16h53   #7
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
Faut juste preciser le nom de ta table principale, la variable qui sert de jointure (je supose que c'est date), le nom de la deuxième table ainsi que la variable que tu veux récupèrer dans celle-ci et comment tu veux la renommer
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 16h58   #8
Invité de passage
 
Femme
Étudiant
Inscription : juillet 2011
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Canada

Informations professionnelles :
Activité : Étudiant
Secteur : Associations - ONG

Informations forums :
Inscription : juillet 2011
Messages : 12
Points : 0
Points : 0
ma table principale s'appelle liste_finale_1, ma variable qui sert de jointure s'Appelle code et non la date. les tables à joindre sont appelés comme ca: table_journaliere_date, table_journaliere_date-1 .........et je recupere toutes varaibles et les renommes toutes avec n-1 elles sont au nombre de 60.
loubna181 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 17h05   #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
Une table SAS ne peux pas s'appeler table_journaliere_date-1 (le -1 ne passera pas).
Et tu renommes quoi en n-1?
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 17h10   #10
Invité de passage
 
Femme
Étudiant
Inscription : juillet 2011
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Canada

Informations professionnelles :
Activité : Étudiant
Secteur : Associations - ONG

Informations forums :
Inscription : juillet 2011
Messages : 12
Points : 0
Points : 0
bein non par exemple table_journalire_20110705 et table_journalire_20110704 et table_journalire_20110703....et ainsi de suite, c'est comme ca qu'elles sont crees
merci
loubna181 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 17h28   #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
Dis-moi si ça répond à ce que tu veux (vu que tu ne donnes pas plus de précisions sur le nom des variables avant et après renommage)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
DATA pivot;
input code$ jour;
cards;
01 30 
02 30
;
run;
 
DATA table_jour29;
input code $ jour;
cards;
01 29
02 29
;
run;
 
DATA table_jour28;
input code $ jour;
cards;
01 28
02 28
;
run;
%let liste=table_jour28 table_jour29;
 
%macro m;
%do i=1 %TO 2;
%let liste&i=%scan(&liste,&i," ");
%put &&liste&i.;
DATA table_&i;
SET &&liste&i.;
RENAME jour=jour&i.;
run;
%end;
 
DATA fin;
	merge pivot %do i=1 %TO 2; table_&i. %end;;
	BY code;
run;
%mend;
%m;
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 17h39   #12
Invité de passage
 
Femme
Étudiant
Inscription : juillet 2011
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Canada

Informations professionnelles :
Activité : Étudiant
Secteur : Associations - ONG

Informations forums :
Inscription : juillet 2011
Messages : 12
Points : 0
Points : 0
merci bcp pour ton aide, je vais m'inspirer de ce que tu m'as envoyé pour faire de quoi je t'enverrais alors ce que j'aurais trouvé
merci encore
loubna181 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 18h30   #13
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.
Je ne suis pas sûr de bien visualiser le besoin, mais je ne suis pas certain qu'il soit nécessaire de faire des macros.
Je verrais quelque chose comme : (1) on empile toutes les tables journalières pour en faire une grosse table tout en longueur, et (2) on fait un MERGE entre la table initiale (qui contient les dates) et la table de l'étape 1, en fonction de la date.
Ci-dessous mon jeu d'essai (bien long puisque je crée plus de 20 tables)
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
DATA work.test ;
  INPUT code :DDMMYY10. autreChose ;
DATALINES ;
10/06/2011 1
11/06/2011 3
14/06/2011 8
17/06/2011 9
;
RUN ;
DATA work.donnees20110601 ;
  info = RANUNI(1) ;
RUN ;
DATA work.donnees20110602 ;
  info = RANUNI(1) ;
RUN ;
DATA work.donnees20110603 ;
  info = RANUNI(1) ;
RUN ;
DATA work.donnees20110604 ;
  info = RANUNI(1) ;
RUN ;
DATA work.donnees20110605 ;
  info = RANUNI(1) ;
RUN ;
DATA work.donnees20110606 ;
  info = RANUNI(1) ;
RUN ;
DATA work.donnees20110607 ;
  info = RANUNI(1) ;
RUN ;
DATA work.donnees20110608 ;
  info = RANUNI(1) ;
RUN ;
DATA work.donnees20110609 ;
  info = RANUNI(1) ;
RUN ;
DATA work.donnees20110610 ;
  info = RANUNI(1) ;
RUN ;
DATA work.donnees20110611 ;
  info = RANUNI(1) ;
RUN ;
DATA work.donnees20110612 ;
  info = RANUNI(1) ;
RUN ;
DATA work.donnees20110613 ;
  info = RANUNI(1) ;
RUN ;
DATA work.donnees20110614 ;
  info = RANUNI(1) ;
RUN ;
DATA work.donnees20110615 ;
  info = RANUNI(1) ;
RUN ;
DATA work.donnees20110616 ;
  info = RANUNI(1) ;
RUN ;
DATA work.donnees20110617 ;
  info = RANUNI(1) ;
RUN ;
DATA work.donnees20110618 ;
  info = RANUNI(1) ;
RUN ;
DATA work.donnees20110619 ;
  info = RANUNI(1) ;
RUN ;
DATA work.donnees20110620 ;
  info = RANUNI(1) ;
RUN ;
DATA work.donnees20110621 ;
  info = RANUNI(1) ;
RUN ;
DATA work.donnees20110622 ;
  info = RANUNI(1) ;
RUN ;
Et voici comment je procèderais. Je profite de la 9.2 qui sait faire un SET avec une liste de tables et leur nom stocké dans la variable désignée après INDSNAME.
Code :
1
2
3
4
5
6
7
8
9
10
11
DATA work.compilation ;
  SET work.donnees: INDSNAME=nomTable ;
  date = INPUT(SUBSTR(SCAN(nomTable,2),8,8),YYMMDD8.) ;
  FORMAT date DDMMYY10. ;
RUN ;
DATA work.melange ;
  MERGE work.compilation (RENAME=(date=code))
        work.test (IN=dans_test) ;
  BY code ;
  IF dans_test THEN OUTPUT ;
RUN ;
Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 19h55   #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 n'ai pas lu tout ton code Olivier mais si tu compiles tout les fichiers d'un seul coup, comment tu vas identifier une variable provenant du fichier Juillet05 et Juillet06?. J'ai cru comprendre qu'elle voulait toper chaque variable en fonction de sa provenance (fichier).
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 20h45   #15
Invité de passage
 
Femme
Étudiant
Inscription : juillet 2011
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Canada

Informations professionnelles :
Activité : Étudiant
Secteur : Associations - ONG

Informations forums :
Inscription : juillet 2011
Messages : 12
Points : 0
Points : 0
Je pense que j'ai tres mal expliqué ce que je voulais, je vais mieux expliquer :
je dispose d'une table principale avec 20 variables dont une est la date. je dispose aussi d'une centaine de tables chacune correspondant à un jour de l'année. Mon but est de partir de ma date principale, lire la date et aller chercher toutes las tables correspondant à 30 jours plus tôt. les tables journelieres contiennent dans leur nom la date comme j'ai mentionné plus tot : table_journalire_20110705, table_journalire_20110704,table_journalire_20110703.......ainsi de suite .....toutes les dates sont possibles, je n'ai pas un champs définis car mon programme est supposé marché quelque soit ces dates. cependant bien sur, puisque les tables journalières contiennent les mêmes variables je devraient les renommer pour que ça ait du sens.
Donc pour revenir, il va falloir créer une table finale qui contient pour chaque observation de la table initiale les variables pour date-1, date-2....jusqu'à date-30. Ah oui un truc important, les tables sont tres grosses
merci beaucoup pour votre interet
loubna181 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 21h03   #16
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 solution que je t'ai proposée répond parfaitement à ton problème:

1) la table principale s'appelle pivot dans mon cas
2) Tu dois renseigner la macro %let liste=table_journalire_20110705 table_journalire_20110704 table_journalire_20110703
3) la boucle ira de 1 à 3 car on a 3 tables dans ce cas
4) dans la macro, jour =jour&i pour chaque table journalière puis je fusionne avec la table principale
5) Comme tu ne m'as pas donné le nom des variables initiales, je les ai appelé jour, donc pour table_journalire_20110705 ça sera jour5
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 21h14   #17
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
@Brice : dans le code, c'est grâce à la pseudo-variable demandée par l'option INDSNAME qu'on trace la table empilée, puis on en dérive la date.

@Loubna: je n'ai effectivement toujours rien compris au problème.
Cela dit, une règle d'or quand on veut construire des macro-programmes c'est d'arriver d'abord à une solution sur un cas particulier, sans utiliser de macros du tout (en écrivant tout en code SAS classique) ; et ensuite on ajoute le macro-langage pour automatiser, quand la partie SAS fonctionne déjà.
Peux-tu nous écrire le code de base, sur un exemple (le 04/07/011 mettons), et sur 2 tables quotidiennes au lieu de 30 pour qu'on comprenne bien ?
Pour le moment, c'est difficile de t'aider en aveugle.
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 21h28   #18
Invité de passage
 
Femme
Étudiant
Inscription : juillet 2011
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Canada

Informations professionnelles :
Activité : Étudiant
Secteur : Associations - ONG

Informations forums :
Inscription : juillet 2011
Messages : 12
Points : 0
Points : 0
Merci ....je vais suivre ton conseil olivier...je vais devoir quitter le bureau mnt, des que je rentre je vais faire l'exercice que tu m'as demandé et je te reviens . Merci bcp
loubna181 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 17h44   #19
Invité de passage
 
Femme
Étudiant
Inscription : juillet 2011
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Canada

Informations professionnelles :
Activité : Étudiant
Secteur : Associations - ONG

Informations forums :
Inscription : juillet 2011
Messages : 12
Points : 0
Points : 0
bonjour
voila comme convenu le code qui va faire une premiere jointure :

Code :
1
2
3
4
5
6
7
8
proc sql;
create table as table_finale_2
as
select a.*,b.*
from 
table_finale_1 left join table_journaliere_20110302
on a.code =b.code and datepart(datereference) = 18689;
quit;
ce qui est en rouge correspond aux elements qui devraient changer de valeur afin de creer la vraie table finale.
aussi, ici je n'ai pas effectuer le changement du nom des variable de la table journaliere
merci
loubna181 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 10h52   #20
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 Loubna.
Ça me paraît une base de travail plus solide comme ça.
Je te propose de découper le problème en 3 :
(1) collecter les noms de variables à renommer et préparer un futur gros RENAME avec des couples ancien nom/nouveau nom, ces derniers étant les anciens noms avec des suffixes _1, ou _2 (pour N-2), etc.
(2) fusionner une table de données journalières avec la table de base en se basant sur le code que tu envoies ; c'est l'occasion de faire ce fameux RENAME
(3) réitérer l'étape (2) sur toutes les dates concernées.
Pour cela, on peut faire 2 ou 3 macros. Je te propose d'en faire 2, la première regroupant les étapes (1) et (2).
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
%MACRO jointure (date, retard, cle) ;
    /* collecte des noms de variables à renommer */
    PROC CONTENTS DATA=table_journaliere_&date (DROP=&cle)
  				 OUT=work.dico (KEEP=name) 
				 NOPRINT ;
    RUN ;
    PROC SQL NOPRINT ; /* création d'une liste de couples ancien nom=nouveau nom */
      SELECT CATS(name,"=",name,"_&suffix") 
                 INTO : listeRename SEPARATED BY " "
	  FROM work.dico
	  ;
	  CREATE TABLE AS table_finale_%EVAL(&retard+1)
		AS
			SELECT a.*,b.*
			FROM 
			table_finale_&retard AS a
				LEFT JOIN 
			table_journaliere_&date (RENAME=(&listeRename)) AS b
			ON a.&cle = b.&cle 
		    WHERE DATEPART(datereference) = INPUT("&date",YYMMDD10.)+&retard ;
	QUIT ;
%MEND jointure ;
Et pour l'étape 3, à toi de bricoler un peu à partir de tes données de DATEREFERENCE, mais ça inclura quelque chose comme :
Code :
1
2
3
4
5
6
7
8
DATA _NULL_ ;
  SET principale ;
  CALL SYMPUTX("dateBase", date) ;
RUN ;
%DO i=1 %TO 30 ;
  %LET nouvelleDate = %EVAL(&dateBase-&i) ;
  %jointure (&nouvelleDate, &i, code) ;
%END ;
Voilà, à toi d'adapter sur ce canevas s'il te semble convenir à ton besoin.
Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h11.


 
 
 
 
Partenaires

Hébergement Web