Le programme SAS généré par un appel de macro peut être sauvegardé dans un fichier externe grâce à l’option globale MFILE. Quel est l’intérêt ? Comment concrètement cela se programme t-il ?A quoi ressemble le résultat ? C’est ce que je vous propose de découvrir dans cet article.
1. Quel est l’intérêt de sauvegarder le code généré par une macro?
- La résolution d’une macro dans la log avec l’option globale MPRINT est agrémenté d’information cachant le cœur du programme. Un accès au programme seul facilite la lisibilité.
- Extraire le code permet de l’exécuter morceau par morceau afin de s’assurer que la demande faite à SAS correspond à ses attentes et éventuellement trouver la cause d’un problème (to debug).
Le même type d’approche est possible avec un programme généré dans un DATA _NULL_.
2. Un exemple pour créer une étape data avec six instructions similaires
Dans cet exemple, le langage macro est utilisé pour générer six instructions dans une étape data au moyen d’une boucle.
A chaque nouvelle instruction une nouvelle variable est créée.
- Elle contient un nombre aléatoire extrait au moyen de la fonction RANUNI et sa racine variant de 1 à 6.
- Cette valeur est multipliée par 49 dans un premier temps.
- La valeur entière inférieure est gardée dans un second temps au moyen de la fonction FLOOR.
options mprint mfile; filename mprint 'C:/sasref/eg_mfile.sas'; %macro eg_mfile; data test; %do i=1 %to 6; var&i. = floor(ranuni(&i.)*49); %end; run; %mend eg_mfile; %eg_mfile;
2 points à respecter : On prendra bien soin de garder l’option MPRINT dans l’instruction OPTIONS et d’utiliser MPRINT comme nom de FILENAME.
3. Visualiser le contenu du fichier EG_MFILE.SAS
Le fichier EG_MFILE.SAS contient le contenu suivant :
data test; var1 = floor(ranuni(1)*49); var2 = floor(ranuni(2)*49); var3 = floor(ranuni(3)*49); var4 = floor(ranuni(4)*49); var5 = floor(ranuni(5)*49); var6 = floor(ranuni(6)*49); run;
Alors que la log, elle, contient des informations supplémentaires exploitables beaucoup moins rapidement.
MPRINT(EG_MFILE): data test; MPRINT(EG_MFILE): var1 = floor(ranuni(1)*49); MPRINT(EG_MFILE): var2 = floor(ranuni(2)*49); MPRINT(EG_MFILE): var3 = floor(ranuni(3)*49); MPRINT(EG_MFILE): var4 = floor(ranuni(4)*49); MPRINT(EG_MFILE): var5 = floor(ranuni(5)*49); MPRINT(EG_MFILE): var6 = floor(ranuni(6)*49); MPRINT(EG_MFILE): run;
Source : redscope.info/node/584 (ce site n’existe plus)