Posts Tagged ‘mfile’

h1

Sauvegarder une résolution de macro dans un fichier externe (l’option MFILE)

février 2, 2009

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)