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 26/07/2011, 11h10   #1
Membre habitué
 
Homme
Consultant informatique
Inscription : mars 2002
Messages : 211
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2002
Messages : 211
Points : 133
Points : 133
Par défaut Amélioration d'une suite de IF THEN

Bonjour,

Je dois vérifier le contenu de +/- 40 champs par ligne dans une grosse table.

Au début, j'ai créé une macro ou je passais en paramètre le champ et la valeur à controller.
Code :
1
2
3
4
5
6
 
%macro (champ, valeur);
   DATA _null_;
    SET ma_source (keep= &champ);
    IF &champ = &valeur then OK;
    ......
Donc si j'utilise cette technique la table sera lue une +/- 40 fois (en fonction du nombre de champ à controller.

Ensuite j'ai essayé de faire le contrôle de manière séquentielle.
A chaque ligne lue, je vérife les 40 champs.
Code :
1
2
3
4
5
6
7
8
 
DATA _null_;
 SET ma_source;
 
 IF champ1= valeur then...
 IF champ2=valeur then...
 IF champ3= valeur then...
....
Je n'ai pas l'impression que ca va plus vite plutôt qu'en parcourant 40 fois ma table.

Quelqu'un aurait-il une meilleure façon de procéder?
! --> Il s'agit simplement de condition IF, pas de IF/ELSE/IF...
Je pense que je ne peut donc pas utiliser un SELECT CASE.

J'ai aussi souvent lu qu'un WHERE était plus rapide qu'un IF.
Mais ici, je ne vois pas comment l'appliquer.

Merci pour vos conseils.
L0007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 11h17   #2
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
Citation:
Je n'ai pas l'impression que ca va plus vite plutôt qu'en parcourant 40 fois ma table.
forcement, puisque tu ne lis pas 40 fois ta table (tu fais tout en une fois).

Citation:
Quelqu'un aurait-il une meilleure façon de procéder?
Je ne suis pas sur qu'il y en ait. ca depend de ce qu'il y a dans tes "then"

Citation:
Je pense que je ne peut donc pas utiliser un SELECT CASE.
A priori, ce n'est utile dans ce cas la, effectivement, puisque tu n'as pas de else.

Citation:
J'ai aussi souvent lu qu'un WHERE était plus rapide qu'un IF.
Mais ici, je ne vois pas comment l'appliquer.
le "where" filtre les donnees en entree (dans ton set). Les autres instructions ne sont executees que pour les donnees filtrees. Ce n'est pas sur que cela s'applique dans ton cas.
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 11h35   #3
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,
le WHERE s'applique sur les données lues et le if sur les données lues et créées lors de l'étape data.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 11h49   #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
pour ton problème initial,
je crois que tu n'as pas besoin de lire la table 40 fois , une seule fois sufira.

1- tu récupère le nom de tes variables dans les vue dictionary, proc contents ou vtables.
Code :
1
2
3
4
5
6
7
8
 
%macro colonnes(le_libname, la_table,la_colonne);
 
proc sql noprint;
SELECT name INTO :var separated BY " "  FROM dictionary.COLUMNS WHERE upcase (libname)="le_libname" AND upcase (memname)="&la_table" AND upcase(name)="&la_colonne";
quit;
 
%put colonnes : &var.;
tu fais une boucle dans l'étape data avec le noms des colonnes et la condition.
tu peux usiliser sa dans un macro programme si tes conditions varient d'une colonnes à une autre.
pour isoler les colonnes tu peux t'inspérer de cet exemple.
Code :
1
2
3
4
5
6
7
8
9
10
 
DATA _null_;
test="1 2 3 4 5 6 7 8 9 ";
i=1;
do while(scan(test,i,' ')ne " ");
word=scan(test,i,' ');
put word;
i=i+1;
end;
run;
au final une boucle %DO à l'intérieur de l'étape data fera l'affaire.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 15h41   #5
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
Si la valeur à tester à chaque IF est la même (ou si elle peut être facilement calculée en fonction de la variable), tu peux simplifier le code en virant la partie macro pour la remplacer par un Array.
Pas d'autre optimisation en vue (l'Array n'ira pas plus vite que 40 IF copiés/collés et adaptés mais donnera juste un programme plus facile à lire et modifier) qu'une unique étape DATA comme tu fais déjà.
Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 14h19   #6
Membre expérimenté
 
Inscription : avril 2009
Messages : 537
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 537
Points : 540
Points : 540
pourquoi ne pas créer un format?
xav2229 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 07h36.


 
 
 
 
Partenaires

Hébergement Web