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 09/11/2011, 16h47   #1
Invité de passage
 
Femme
Consultant CRM
Inscription : novembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Consultant CRM
Secteur : Conseil

Informations forums :
Inscription : novembre 2011
Messages : 5
Points : 1
Points : 1
Par défaut Numérotation de colonne et boucle

Bonjour,

Voici le programme que je souhaite automatiser:
J'ai une cinquantaine de variables sur lesquelles je vais exécuter la même opération (opération très simple multiplication / soustraction). Une fois l'ensemble des calculs effectués je souhaite supprimer toutes les variables initiales. Enfin la table obtenue sera exportée sous excel pour directement alimenter un tableau de bord préfait.

Ce que je ne souhaite pas faire c'est modifier le nom de mes variables pour exécuter ma boucle dessus (var1 var2 -- varn). Le nom de chacune des variables est très important dans le sens où les données seront transmises à d'autres personnes sans forcément les avoir mises en forme.



Je cherche donc un moyen de compter le nombre de colonnes de ma table (proc contents certainement mais je ne suis sûre) mais surtout un moyen de dire exécute l'opération de la colonne Numéro X jusqu'à la dernière colonne sans prendre en compte le nom des variables.

Est ce possible à votre avis d'appeler une colonne par sa position dans la table et non par son nom?
Noyellie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 16h53   #2
Membre Expert
 
Inscription : mars 2005
Messages : 1 010
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 010
Points : 1 258
Points : 1 258
Envoyer un message via Yahoo à bahraoui
Bonjour,

Tu peux utiliser un tableau "array" pour ce genre d'opération.

Cordialement
Salah
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 17h11   #3
Invité de passage
 
Femme
Consultant CRM
Inscription : novembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Consultant CRM
Secteur : Conseil

Informations forums :
Inscription : novembre 2011
Messages : 5
Points : 1
Points : 1
Je ne suis pas la pro des vecteurs alors je vais avoir besoin de quelques précisions

Si je passe par un array je dois définir dès le départ l'ensemble de mes variables, c'est bien ça ? array X (50) tata tot titi ... blabla blibli bloblo

Dans le cas d'un ajout de variable dans la macro je devrais l'ajouter au vecteur?

Array correspond à ce que je souhaite faire mais également sans avoir à lister l'ensemble des variables que j'utilise, d'où la recherche du numéro de colonne. Mais vu que je ne maitrise pas les array peut-être existe-t-il une option qui simplifie tout ça ?

merci!!!
Noyellie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 17h24   #4
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 957
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 : 957
Points : 1 368
Points : 1 368
Bonjour,
Vu que tu fais des opérations sur des variables numériques, tu peux donc définir
ton vecteur de la sorte


Code :
1
2
3
4
5
6
7
DATA test;
SET test;
array var_initial(*) _numeric_;
do i=1 TO dim(var_initial);
.........
end;
run;
Bon courage!
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 17h24   #5
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 012
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 012
Points : 1 713
Points : 1 713
hello;
peux tu poster un exemple de CODE et/ou données en entrée et résultat souhaité?
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 17h35   #6
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 957
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 : 957
Points : 1 368
Points : 1 368
Si jamais les vecteurs ne te convient, tu peux renommer toutes les variables par COL1...COLN

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
proc contents DATA =sashelp.class out=name;
run;
 
proc sort DATA=name;
BY varnum;
run;
 
proc sql;
SELECT name INTO:name separated BY ' ' FROM name;
SELECT count(*) INTO :nb;
quit;
 
%MACRO M;
DATA test;
%do i=1 %TO &nb;
%let x=%scan(&name, &i,' ');
SET sashelp.class;
RENAME &&x=COL&i.;
%end;
run;
%mend;
 
%M;
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 18h12   #7
Invité de passage
 
Femme
Consultant CRM
Inscription : novembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Consultant CRM
Secteur : Conseil

Informations forums :
Inscription : novembre 2011
Messages : 5
Points : 1
Points : 1
Ah génial, ça donne de bonnes idées !!

@Megamind2 : dans le deuxième code, si je l'utilise est ce qu'il peut me permettre de revenir en arrière (redonner les noms initiaux aux variables recalculées)? Est ce que tu peux m'expliquer un peu plus en détail ce qu'exécute le bout de programme pour être sûre que je ne loupe rien.

@ Sam: Je n'ai pas encore écrit de programme car je cherchais tout d'abord à identifier les colonnes concernées. Mais voici globalement ce que je cherche à faire. L'opération est vraiment très simple mais c'est juste l'identification des colonnes qui complexifi. Dans le programme je cherche à identifier (si possible sans changer le nom des variables, sans les énumérer ou autre) par le moyen le plus simple PremiereCol / DerniereCol / Col&i sachant que chaque colonne a un nom différent sans lien mais important.

Code :
1
2
3
4
5
6
7
8
%Macro Z();
DATA Calculs;
SET base;
%do &i = PremiereCol %TO DerniereCol;
R_Col&i = Col&i / TOTAL;
run;
 
%Mend;
Merci Merci!!
Noyellie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 19h11   #8
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 957
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 : 957
Points : 1 368
Points : 1 368
Voila, voilou!!

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
 
/* on récupère le nom des variables*/
proc contents DATA =sashelp.class out=name;
run;
 
/* garder l'ordre initial des variables*/
proc sort DATA=name;
BY varnum;
run;
 
/* on stock les variables sous forme de liste*/
proc sql noprint;
SELECT name INTO:liste separated BY ' ' FROM name;
SELECT count(*) INTO :nb FROM name;/*nombre total de variables*/
quit;
 
/*affichage dans l'output*/
%put liste_variable=&liste.;
%put nombre de var=&nb.;
 
 
/* renommage en COL */
%MACRO M1;
DATA test;
%do i=1 %TO &nb;
%let x=%scan(&liste , &i,' ');/*on scanne élément de la liste de variables afin de renommer en COL&i*/
SET sashelp.class;
RENAME &&x=COL&i.;
%end;
run;
%mend;
 
%M1;
 
/* renommage en sens inverse*/
%MACRO M2;
DATA test2;
%do i=1 %TO &nb;
%let x=%scan(&liste, &i,' ');
SET sashelp.class;
RENAME COL&i=&&x;
%end;
run;
%mend;
 
%M2;
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 14h26   #9
Invité de passage
 
Femme
Consultant CRM
Inscription : novembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Consultant CRM
Secteur : Conseil

Informations forums :
Inscription : novembre 2011
Messages : 5
Points : 1
Points : 1
Bonjour, Bonjour,

Désolée pour le temps de réponse un peu long, j'ai été sur d'autres taches!

Merci, ça marche vraiment bien, exactement ce dont j'avais besoin
Noyellie 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 10h39.


 
 
 
 
Partenaires

Hébergement Web