📖 Module VIII - Les macro-variables
- Comprendre à quel moment et par quel compilateur le macro-langage est traité
- Créer une macro-variable par %LET et par CALL SYMPUT / CALL SYMPUTX
- Distinguer l'environnement GLOBAL de l'environnement LOCAL
- Résoudre une macro-variable avec &, avec les & consécutifs et avec SYMGET
1. Introduction au langage Macro
Le langage MACRO est un moyen d'écrire des programmes SAS paramétrables et de simplifier des traitements répétitifs. Il est notamment utilisé dans les situations suivantes :
- Plusieurs traitements identiques à exécuter avec uniquement une option ou un critère de sélection à modifier
- Automatisation de programme SAS en fonction d'une valeur récupérée par ailleurs
- Génération dynamique de code SAS, ce qui ouvre des possibilités jusqu'alors insoupçonnées en SAS/Base
Le langage MACRO comporte trois éléments principaux :
- le macro-programme est une suite d'instructions SAS classiques, de macro-variables, de macro-instructions et de macro-fonctions — plus communément appelé « macro »
- les macro-variables sont des paramètres utilisés dans le macro-programme
- les macro-fonctions fonctionnent comme les fonctions SAS Base, mais elles sont traitées par un macro-compilateur
Dans un programme SAS, le langage MACRO est toujours traité en PREMIER. Les étapes DATA et PROC et autres éléments de BASE sont traités après. SAS analyse le code et détecte du langage macro si l'un des deux caractères suivants est présent, sauf s'ils sont entre simples quotes : % et &.
La compilation d'un macro-programme se fait en deux temps :
- Compilation par le compilateur du macro-langage, le macro-compilateur
- Compilation par le compilateur SAS
Le macro-compilateur résout chaque élément du macro-langage — macro-variables, macro-fonctions — rencontré dans le programme et reconnaissable grâce aux caractères & pour les macro-variables ou % pour les macro-instructions et macro-fonctions qui les précèdent. Une fois ce premier passage effectué, si du code SAS a été généré, il est exécuté par le compilateur SAS comme s'il s'agissait d'un programme SAS Base classique.
2. Qu'est-ce qu'une macro-variable ?
Une macro-variable permet de stocker du texte et d'y faire référence. Il existe deux types de macro-variables :
- Les macro-variables automatiques : créées automatiquement à l'ouverture de la session SAS. Par exemple SYSDATE, date de démarrage de la session SAS, ou SYSLAST, nom de la dernière table soumise
- Les macro-variables définies par l'utilisateur
Caractéristiques des macro-variables :
- Elles commencent toujours par une lettre ou un tiret bas
- Le format de stockage est toujours du texte
- Les caractères spéciaux, et tout particulièrement % ou &, sont à éviter
- La longueur maximale d'une macro-variable est de 65 534 caractères
3. Créer une macro-variable avec %LET
L'instruction %LET crée une macro-variable en lui donnant un nom et lui assigne une valeur. Elle peut être utilisée à n'importe quel endroit d'un programme SAS, et pas nécessairement dans un macro-programme.
%let VARIABLE = VALEUR ;
Le champ VALEUR peut être :
- vide
- une chaîne de caractères
- une expression avec des macro-variables
- une expression avec des macro-fonctions
- l'appel d'un macro-programme
Affichage d'une macro-variable via l'instruction %PUT. L'instruction %PUT permet d'inscrire dans la LOG la valeur prise par une macro-variable.
%PUT ¯o-variable. ;
Si l'instruction %PUT fait référence à une macro-variable qui n'existe pas, un warning apparaît dans la LOG.
%let name = John Doe ; %let name2 = ' John Doe '; %let title = "John's Report"; %let start = ; %let sum1 = 3+4; %let sum2 = 0;
Voir le corrigé
%put &name ; %put &name2 ; %put &title ; %put &start ; %put &sum1 ; %put &sum2 ;
Valeurs obtenues : name = John Doe (les blancs de début/fin sont supprimés par %LET, pas les blancs internes) ; name2 = ' John Doe ' (les quotes font partie du texte : le macro-langage ne les interprète pas) ; title = "John's Report" (idem) ; start = chaîne vide ; sum1 = 3+4 (texte brut, aucun calcul n'est effectué) ; sum2 = 0.
4. Créer une macro-variable avec CALL SYMPUT
À partir du contenu d'une table SAS, il est possible de créer une macro-variable grâce à l'instruction CALL SYMPUT à l'intérieur d'une étape DATA.
data TABLE ;
set TABLE ;
call symput("NOM", VALEUR) ;
run ;
NOM et VALEUR respectent les mêmes caractéristiques que celles décrites plus haut.
Voir le corrigé
data _null_ ;
set sashelp.prdsale (obs=1) ;
call symput("PRODUIT", product) ;
run ;
%put &produit ;
La variable automatique _N_. Dans une étape DATA, la variable _N_ est créée automatiquement. Elle contient le numéro de l'observation lue.
Voir le corrigé
data work.prdsale2 ;
set sashelp.prdsale ;
obs = _n_ ;
run ;
Voir le corrigé
proc sort data=sashelp.prdsal3 (keep=product) out=work.produits nodupkey ;
by product ;
run ;
data _null_ ;
set work.produits nobs=n ;
call symputx("N", n, "G") ;
stop ;
run ;
%put &N ;
L'option NOBS de l'instruction SET donne le nombre total d'observations dès la première lecture ; STOP évite de parcourir inutilement le reste de la table.
Voir le corrigé
data _null_ ;
set work.produits ;
call symputx(cats("PRODUIT", _n_), product, "G") ;
run ;
%put &produit1 &produit2 &produit3 &produit4 ;
5. Remarques et notions d'environnement
Jusqu'à la version SAS 8.2, pour éliminer les blancs contenus dans les valeurs numériques lors de la création d'une macro-variable, il fallait utiliser les fonctions COMPRESS ou LEFT et TRIM.
Depuis la version SAS 9, on peut directement utiliser l'instruction CALL SYMPUTX qui récupère la valeur de la variable numérique en supprimant les blancs et en justifiant à gauche. Un troisième argument a également été ajouté : l'environnement de référence dans lequel sera stockée la macro-variable, L pour local ou G pour global. Ce dernier argument est très pratique car il évite les instructions %GLOBAL.
call symputx("NOM", VALEUR, "G") ;
On distingue deux environnements :
- L'environnement GLOBAL, par défaut : les macro-variables créées dans cet environnement sont disponibles durant toute la durée de la session SAS active et accessibles depuis toute sorte de programme SAS, SAS/Base ou SAS/Macro. On crée ces macro-variables à l'aide du %LET.
- L'environnement LOCAL : les macro-variables créées dans cet environnement ne sont disponibles que lors de l'exécution du macro-programme dans lequel elles sont créées.
Les macro-variables automatiques sont créées par le système SAS dans l'environnement GLOBAL. Si l'utilisateur crée une macro-variable dans un macro-programme, celle-ci sera définie en environnement LOCAL — sauf si le macro-programme n'a pas de paramètre. Elle ne peut être stockée en environnement GLOBAL que si elle est créée en dehors du macro-programme, ou si elle est déclarée comme devant être GLOBALE dans le macro-programme.
Toutes les macro-variables existantes sont disponibles dans une base de la librairie SASHELP, accessible via la vue VMACRO.
Affichage des macro-variables. Les expressions suivantes permettent d'afficher les valeurs de toutes les macro-variables définies dans la session :
| Instruction | Contenu affiché |
|---|---|
| %put _ALL_ ; | Toutes les macro-variables |
| %put _AUTOMATIC_ ; | Toutes les macro-variables automatiques |
| %put _USER_ ; | Toutes les macro-variables créées par l'utilisateur |
| %put _LOCAL_ ; | Toutes les macro-variables stockées en environnement LOCAL |
| %put _GLOBAL_ ; | Toutes les macro-variables stockées en environnement GLOBAL |
Exemples de macro-variables automatiques :
| Macro-variable | Contenu |
|---|---|
| SYSDATE | Date du début de la session SAS au format DATE7. |
| SYSDATE9 | Date du début de la session SAS au format DATE9. |
| SYSDAY | Jour de la semaine, en littéral, de la session SAS |
| SYSLAST | Nom de la dernière table utilisée |
| SYSERR | Code du type d'erreur rencontré : 0 exécution OK sans message ; 1 et 2 exécution arrêtée ; 3 et au-delà de 4 erreur dans le programme ; 4 exécution OK mais warning |
| SYSLIBRC | Vaut 0 si le LIBNAME s'est bien exécuté |
| SYSVER | Version de SAS utilisée |
6. Résolution et utilisation d'une macro-variable avec &
Pour faire référence à une macro-variable, il faut utiliser le caractère spécial & suivi du nom de la macro-variable.
Voir le corrigé
%let total = &sum1+&sum2 ; %put &total ;
La LOG affiche 3+4+0 : c'est bien une concaténation de texte, pas un calcul. Pour obtenir le résultat numérique 7, il faudrait passer par %EVAL, vu au module X.
Voir le corrigé
%let librairie = SASHELP ; %let table = PRDSAL3 ; %let ref = &librairie..&table ; %put &ref ;
Il est possible de référencer des macro-variables de manière indirecte, ce qui est souvent utilisé dans les boucles macro. Lorsque l'on utilise des & consécutifs, SAS convertit && en & jusqu'à la résolution complète de la macro-variable.
Exemple : dans &&&variable, SAS résout &variable, convertit && en &, puis continue le traitement.
%let toto = ma valeur ; %let titi = toto ; %let tata = titi ;
Afficher la valeur « ma valeur » dans la LOG en utilisant %PUT et seulement la macro-variable TATA.
Voir le corrigé
%put &&&tata ;
Déroulé : && devient &, puis &tata se résout en titi → résultat intermédiaire &titi. &titi se résout en toto → résultat &toto. &toto se résout enfin en ma valeur. Trois esperluettes suffisent ici car il n'y a que deux niveaux d'indirection à traverser (tata→titi→toto→valeur).
7. Résolution avec la fonction SYMGET dans une étape DATA
La fonction SYMGET permet de stocker le contenu d'une macro-variable dans une variable SAS à l'intérieur d'une étape DATA.
SYMGET(argument) ;
Où argument peut être :
- le nom d'une macro-variable entre doubles quotes, sans le caractère &
- le nom d'une variable SAS caractère : les valeurs de la nouvelle variable seront les valeurs des macro-variables ayant pour nom les valeurs de la variable passée en argument
- une expression caractère pouvant être la concaténation d'une chaîne de caractères et d'une variable
- Créer une macro-variable REG contenant la valeur EUR.
- Sélectionner dans une table temporaire DEMO les observations de la région Europe, en utilisant la macro-variable créée en 1.
- Sur le même modèle, ajouter une variable TEXTE contenant le texte « Zone géographique : Europe (EUR) ».
- Créer une macro-variable dans la même étape DATA qui contient le code ISO de la Slovaquie.
- En dehors de l'étape DATA, écrire dans la LOG le code ISO de la Slovaquie.
- Exécuter le même programme pour obtenir le code du Guatemala.
Voir le corrigé
/* 1 */
%let REG = EUR ;
/* 2 */
data work.demo ;
set sashelp.demographics ;
where region = "®" ;
run ;
/* 3 : SYMGET resout la macro-variable a l'interieur de l'etape DATA */
data work.demo ;
set work.demo ;
length texte $ 60 ;
texte = "Zone geographique : Europe (" || trim(symget("REG")) || ")" ;
run ;
/* 4 et 5 */
data _null_ ;
set sashelp.demographics ;
if name = "Slovakia" then call symputx("COMM", iso, "G") ;
run ;
%put Code ISO de la Slovaquie : &COMM ;
/* 6 : une seule ligne a modifier */
data _null_ ;
set sashelp.demographics ;
if name = "Guatemala" then call symputx("COMM", iso, "G") ;
run ;
%put Code ISO du Guatemala : &COMM ;
L'objectif pédagogique de la question 6 est qu'une seule chaîne de caractères change entre les questions 5 et 6. Une version plus aboutie remplacerait le nom en dur par une macro-variable PAYS, ce qui prépare directement le passage au macro-programme du module IX.
8. Supprimer une macro-variable
Pour supprimer une ou plusieurs macro-variables, on utilise la macro-instruction %SYMDEL.
%SYMDEL macro-variable1 macro-variable2 ... ;
Voir le corrigé
%symdel REG COMM ;
- QCM — QCM Module VIII — 6 questions, auto-évaluation
Background Colour
Font Face
Font Kerning
Image Visibility
Line Height
Link Highlight
Text Alignment
Font Size
Letter Spacing
Text Colour
Paragraph Width