• Keine Ergebnisse gefunden

Utilisation des macro-fonctions et des boucles %DO LOOP dans la

CHAPITRE III : UTILISATION DES MACRO-

III. 2.2.5.2. Stocker le nom de toutes les variables dans une seule macro-variable

III.5. Introduction aux macro-programmes

III.5.2. Utilisation des macro-fonctions et des boucles %DO LOOP dans la

La construction d’un macro-programme n’est intéressant que s’il est conçu pour exécuter des tâches nécessitant l’utilisation des macro-fonctions mais aussi des boucles %DO LOOP, %WHILE ou %UNTIL. Les macro-programmes sont généralement des successions et des imbrications des boucles %DO LOOP qu’il faut pouvoir déceler afin de comprendre la structure du programme.

Dans cette section, nous montrons comment utiliser les macro-fonctions et les boucles %DO afin de construire un macro-programme évolué. Pour cela, nous partirons des cas les plus simples qui peuvent être facilement généralisés.

Pour commencer, considérons l’exemple où l’on souhaite calculer (en utilisant DATA STEP classique) dix variables définies comme suit :

DATA MYDATA ; SET MYDATA ;

DESTINATION_1="Cary";

DESTINATION_2="New-York";

DESTINATION_3="Chicago";

DESTINATION_4="Los-Angeles";

DESTINATION_5="Austin";

DESTINATION_6="Boston";

DESTINATION_7="Orlando";

DESTINATION_8="Dallas";

DESTINATION_9="Knoxville";

DESTINATION_10="Asheville";

RUN ;

On peut rendre efficiente ce code en utilisant une commande (un mini macro-programme). Pour cela, nous devons d’abord définir des macro-variables.

En regardant ce code, on peut définir deux macro-variables : une première qui contient la liste des villes et une seconde qui est en fait un compteur allant de 1 à 10.

La macro-variable correspondant à ce compteur est un suffixe pour le mot DESTINATION_ tandis que l’ensemble des formeront une macro-variable. Essayons maintenant d’écrire cette tâche sous forme de macro-commande. Nous proposons le programme suivant :

/*Définition de la macro*/

%macro macro_cities;

%LET cities= Cary New-York Chicago Los-Angeles Austin Boston Orlando Dallas Knoxville Asheville;

%let k = %SYSFUNC(countw(&cities, ' '));

DATA MYDATA;

SET MYDATA;

%Do i=1 %to &k ;

%let city_&i = %scan(&cities,&i,’ ’);

DESTINATION&i="&&city_&i";

%end ; Run;

%mend macro_cities;

/*Execution de la macro*/

%macro_cities; quit;

Comme on peut le constater le programme construit ici est un programme qui ne demande pas de spécifier les arguments. Tous les arguments sont déjà disponibles dans le corps du programme. La structure du programme est le suivant :

D’abord, on stocke la liste des villes dans une macro nommée cities.

Ensuite, nous créons une macro-variable nommée k qui compte le nombre de mots rencontré dans la variable cities. Ce comptage est fait en utilisant la macro-fonction countw(). Mais pour exécuter cette macro-fonction, on utilise une autre macro fonction %SYSFUNC() dont le rôle est d’exécuter toutes les macro-fonctions qu’on lui fournit comme arguments. En effet, étant donné que certaines macro-fonctions (telles que celles écrites par les utilisateurs) ne s’exécutent pas automatiquement, on est souvent amené à utiliser %SYSFUNC ou %QSYSFUNC pour exécuter ces types de macros-fonctions. C’est le cas ici pour la macro-fonction COUNTW. Ainsi, le nombre de mots trouvés par la fonction COUNTW est stocké dans la macro-variable k. Ce nombre représente alors la valeur maximale de l’indice de la boucle. Toutefois, avant définir la boucle, nous invoquons une étape DATA afin d’activer la table à modifier.

Ainsi, on ouvre la boucle avec la clause %DO %TO en introduisant un compteur i variant de 1 à k. Notons que, par définition dans un macro-programme, un compteur défini par %Do est une macro-variable. Il sera donc traité comme pendant toute sa durée d’utilisation.

Une fois que le compteur i est déclaré, on crée une nouvelle macro-variable indexée sur i qui contient le mot se trouvant à i-ième position dans la liste définie par la macro-variable cities. Cet i-ième mot est renvoyé en utilisant la macro-fonction

%SCAN(). Une fois que ce mot est renvoyé, on créer la i-ième variable correspondant à la i-ième destination à laquelle on assigne la valeur contenue dans la macro city&i (c'est-à-dire la i-ième ville de la liste des villes définie par cities. Au final, en exécutant cette macro-commande, on obtient les mêmes résultats qu’un DATA STEP avec code libre. Cependant, on peut constater que la macro-commande telle que spécifiée a presque le même nombre de lignes que la première formulation en code libre (sinon un peu plus). On peut alors se demander quelle a été le véritable apport de l’utilisation de la macro-commande. En effet, l’utilisation de la macro-commande est avantageuse que lorsque le nombre de tâches à réaliser devient important. Par exemple supposons maintenant qu’il y ait 5 tables au lieu d’une et qu’il faille réaliser les mêmes opérations sur les mêmes tables. A ce moment, l’écriture en macro-commande prend systématiquement avantage par rapport au code. Par exemple, le code ci-dessous réalise les mêmes opérations en considérant cinq tables nommée tab1 jusqu’à tab5.

/*Définition de la macro*/

%macro macro_cities;

%LET cities= Cary New-York Chicago Los-Angeles Austin Boston Orlando Dallas Knoxville Asheville;

%let k = %SYSFUNC(countw(&cities, ' '));

%Do i=1 %to 5 ; DATA tab&i;

SET tab&i;

%Do j=1 %to &k ;

%let city_&j = %scan(&cities,&j,’ ’);

DESTINATION&j="&&city_&j";

Run;

%end ;

%end ;

%mend macro_cities;

Cette macro-commande est bien la preuve que l’efficience d’un macro-programme augmente lorsque le nombre de tâches à effectuer est très élevé.

En conclusion, le choix de l’outil de codage doit être fait en fonction de l’efficience.

Par conséquent l’utilisation de macro-programmes n’est pas nécessaire dans tous les contextes. Un code libre peut souvent fournir les meilleurs résultats de par leur clarté et leur simplicité.

CHAPITRE IV : LES METHODES D’ANALYSES DE