📖 Module X - Macro-fonctions et débogage
- Utiliser les macro-fonctions de manipulation de chaînes
- Protéger des caractères spéciaux avec les macro-fonctions de quoting %STR et %NRSTR
- Appeler une fonction SAS Base depuis le macro-langage avec %SYSFUNC
- Calculer avec %EVAL et %SYSEVALF, et déboguer avec SYMBOLGEN, MPRINT et MLOGIC
1. Généralités
Les fonctions SAS usuelles ne sont pas accessibles dans le cadre d'un macro-programme. Il faut avoir recours aux macro-fonctions. On peut retenir qu'en règle générale, préfixer un mot-clé ou une fonction SAS par le caractère % permet de trouver leur équivalent en macro-langage.
2. Les macro-fonctions identiques à SAS Base
Les macro-fonctions de manipulation de chaînes de caractères.
| Macro-fonction | Rôle |
|---|---|
| %length() | Retourne la longueur de l'argument |
| %index(), %scan(), %substr(), %upcase() | Fonctionnent comme leurs équivalents en langage SAS Base |
| %qscan(), %qsubstr(), %qupcase() | Permettent en outre d'ignorer les caractères réservés % et &, qui sont alors considérés comme des caractères normaux et donc non interprétés |
- Récupérer le département à partir d'un code postal
- Récupérer la longueur de la macro-variable CP
- À partir d'une chaîne de la forme prénom-nom : mettre la chaîne en majuscules, puis en minuscules
- Récupérer dans une macro-variable le prénom
- Trouver la position de la lettre a
Voir le corrigé
%let cp = 75015 ; %put Departement : %substr(&cp,1,2) ; %put Longueur de CP : %length(&cp) ; %let nom = Julie-Martin ; %put %upcase(&nom) ; %put %lowcase(&nom) ; %let prenom = %scan(&nom,1,-) ; %put Prenom : &prenom ; %put Position de la lettre a : %index(&nom,a) ;
Les macro-fonctions de quoting %STR et %NRSTR. Les macro-fonctions dites de quoting permettent à SAS d'interpréter des caractères spéciaux, tels que le point-virgule ou l'apostrophe, ou encore des mots-clés tels que NE, OR, GT, LT, comme du texte et non comme faisant partie intégrante du macro-langage.
| Macro-fonction | Rôle |
|---|---|
| %str(expression) | Masque les caractères spéciaux |
| %nrstr(expression) | Masque les caractères spéciaux, y compris % et & |
Voir le corrigé
%let programme = %str(proc print ; run ;) ; %put &programme ;
Sans %STR, le point-virgule serait interprété comme la fin de l'instruction %LET, et le macro-processeur signalerait une erreur de syntaxe bien avant d'atteindre RUN.
3. Les macro-fonctions spécifiques
Liste non exhaustive :
| Macro-fonction | Rôle |
|---|---|
| %SYSFUNC | Exécute UNE fonction SAS. Il est possible de spécifier un format en deuxième argument |
| %EVAL | Fait des opérations sur des nombres entiers |
| %SYSEVALF | Fait des opérations sur des décimales |
| %BQUOTE | Masque les blancs et caractères spéciaux |
| %NRBQUOTE | Masque en plus les % et & |
La très utile macro-fonction %SYSFUNC. Les macro-fonctions identiques à celles de SAS Base n'étant pas nombreuses, il est souvent utile de faire appel à %SYSFUNC, qui permet d'utiliser la plupart des fonctions du langage SAS/Base.
%upcase("toto") est equivalent a %sysfunc(upcase("toto"))
%sysfunc(int(ranuni(0)*100)) tire un entier entre 0 et 100
Voir le corrigé
%let msg = Cours de SAS du %sysfunc(date(), ddmmyy8.) ; %put &msg ; %let msg2 = %sysfunc(tranwrd(&msg, S, Z)) ; %put &msg2 ;
Voir le corrigé
%put %sysfunc(sqrt(1971)) ;
4. Les fonctions d'évaluation %EVAL et %SYSEVALF
La valeur d'une macro-variable est un texte, mais on peut forcer le macro-compilateur à exécuter des opérations avec les macro-fonctions %EVAL et %SYSEVALF. Les opérations supportées se limitent aux additions, soustractions, multiplications et divisions.
%EVAL(expression)
%EVAL évalue des calculs sur des entiers à partir d'expressions contenant des macro-variables. Attention : cette macro-fonction ne traite et ne retourne que des nombres entiers. Le résultat du calcul est arrondi à l'entier inférieur.
Voir le corrigé
%let un = 1 ; %let deux = 2 ; %put Somme : %eval(&un + &deux) ; %put Produit : %eval(&un * &deux) ; %put Division : %eval(&un / &deux) ;
La division affiche 0 : %EVAL ne travaille que sur des entiers et tronque le résultat, elle ne l'arrondit pas au plus proche.
%SYSEVALF(expression, type de conversion)
%SYSEVALF évalue des calculs sur des valeurs numériques décimales à partir d'expressions contenant des macro-variables. Le deuxième argument, non obligatoire, permet éventuellement de convertir le résultat. Les valeurs possibles pour ce paramètre sont :
| Valeur | Effet |
|---|---|
| boolean | 0 si le résultat est nul ou manquant, 1 sinon |
| ceil | Le plus petit entier supérieur ou égal à l'évaluation de l'expression |
| floor | Le plus grand entier inférieur ou égal à l'évaluation de l'expression |
| integer | Partie entière |
- Diviser i par 2 sans préciser le type de conversion
- Diviser i par 2 avec le type de conversion boolean
- Faire une addition de i et de la valeur manquante avec le type de conversion boolean
- Diviser i par 2 avec le type de conversion ceil
- Diviser i par 2 avec le type de conversion floor
Voir le corrigé
%let i = 5 ; %put Sans conversion : %sysevalf(&i/2) ; %put Boolean : %sysevalf(&i/2, boolean) ; %put Boolean avec manquant : %sysevalf(&i + ., boolean) ; %put Ceil : %sysevalf(&i/2, ceil) ; %put Floor : %sysevalf(&i/2, floor) ;
&i/2 vaut 2.5 : sans conversion la valeur exacte est affichée, avec ceil on obtient 3, avec floor on obtient 2. L'addition avec une valeur manquante donne un résultat manquant, donc boolean renvoie 0.
5. Les options de débogage
Plusieurs options permettent de déboguer un code écrit en macro-langage.
L'option SYMBOLGEN permet d'afficher dans la LOG la valeur d'une macro-variable lors de sa résolution.
OPTIONS SYMBOLGEN ;
Elle est également positionnable au démarrage de SAS ou dans le fichier de configuration de SAS. Pour la désactiver, on utilise NOSYMBOLGEN.
OPTIONS SYMBOLGEN ; %let quantite = %EVAL(5+3+7) ; %let prix = 3 ; %let total = %EVAL(&prix*&quantite) ; %let moy_jour = %EVAL(&total/7) ;
L'option MPRINT permet d'afficher dans la LOG le code SAS généré puis exécuté au travers d'un macro-programme, et plus particulièrement de vérifier la bonne résolution des macro-variables.
OPTIONS MPRINT ;
Elle est également positionnable au démarrage de SAS ou dans le fichier de configuration de SAS. Pour la désactiver, on utilise NOMPRINT.
OPTIONS MPRINT ;
%MACRO exemple(table=PRDSAL3, var1=, var2=) ;
ODS HTML body = 'C:\temp\exemple.html' ;
PROC PRINT data = SASHELP.&table(obs=5) ;
%IF &var1 ne and &var2 ne %THEN %DO ;
var &var1 &var2 ;
%END ;
RUN ;
ODS HTML close ;
%MEND ;
%exemple(table=PRDSAL3, var1=PRODUCT, var2=PREDICT) ;
L'option MLOGIC permet d'afficher dans la LOG, lors d'un test sur la valeur d'une macro-variable, si l'expression est vérifiée ou non.
OPTIONS MLOGIC ;
Elle est également positionnable au démarrage de SAS ou dans le fichier de configuration de SAS. Pour la désactiver, on utilise NOMLOGIC.
%MACRO mlogic(table=PRDSAL3, var1=, var2=) ;
ODS HTML body = 'C:\temp\exemple.html' ;
PROC PRINT data = SASHELP.&table(obs=5) ;
%IF &var1 ne and &var2 ne %THEN %DO ;
var &var1 &var2 ;
%END ;
RUN ;
ODS HTML close ;
%MEND mlogic ;
%mlogic(table=PRDSAL3, var1=PRODUCT, var2=PREDICT) ;
- QCM — QCM Module X — 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