
FAQ SASConsultez toutes les FAQ
Nombre d'auteurs : 14, nombre de questions : 232, dernière mise à jour : 20 décembre 2012
Sommaire→Macro Langage→Macrovariables- Comment récupérer le nombre d'observations d'une table dans une macrovariable ?
- Comment utiliser les variables d'environnement système dans un programme SAS ?
- Comment utiliser la macrovariable SYSDATE ?
- Comment créer des macrovariables à partir d'une table SAS ?
- Comment supprimer une macrovariable ?
- Comment lister toutes les macrovariables de votre session ?
- Comment lister les macrovariables créées automatiquement par SAS ?
- Comment connaître les macrovariables créées par un utilisateur ?
- Quel est le type d'une macrovariable ?
- Comment stocker les valeurs d'une macrovariable dans une table ?
- Comment afficher la valeur d'une macrovariable ?
- Comment lister les noms des tables d'une bibliothèque dans une macrovariable ?
- Comment exécuter une procédure SAS à partir d'une macrovariable ?
- Comment stocker des caractères spéciaux dans une macrovariable ?
- Comment faire un calcul à l'aide de macrovariables ?
Pour récupérer le nombre d'observations, il faut utiliser l'option NOBS dans l'instruction SET.
Pour créer une macrovariable, il faut utiliser la fonction CALL SYMPUT.
options symbolgen ;
data _null_;
set sashelp.class nobs=nobs ;
call symput ("nbobs",nobs);
run;
%put "Le nombre d'observations de la table est :" &nbobs ; La fonction "SYSGET" permet de récupérer le contenu d'une variable d'environnement Système. Voici un exemple où l'on récupère le nom de l'utilisateur (variable Windows "USERNAME") dans une variable SAS.
data _null_;
length MONUSER $50;
MONUSER=sysget(trim("USERNAME"));
put MONUSER=;
run; Le principe est le même pour les variables Unix :
MAVARIABLE=sysget(trim("$HOME"));
La macrovariable SYSDATE renvoie la date système courante en utilisant le format DATE7.
La date système "January 5, 2000" sera donc codée "05JAN00".
Exemple :
data _null_ ;
date = input("&sysdate",date7.) ;
put date ddmmyy8. ;
run ;Résultat : 05/01/00
Avec le passage à l'an 2000, lorsque l'option YEARCUTOFF n'est pas positionnée, cela peut engendrer des problèmes si des tests sont réalisés par rapport à cette date.
En effet, sans le positionnement de YEARCUTOFF, la valeur de l'exemple précédent sera interprétée comme la date 05/01/1900.
Pour que la valeur renvoyée par SYSDATE soit interprétée correctement, il suffit de positionner l'option YEARCUTOFF à une valeur qui vous convient.
Exemple :
options yearcutoff = 1920 ;
data _null_ ;
date = input("&sysdate",date7.) ;
put date ddmmyy10. ;
run ;Résultat : 05/01/00
À partir des versions 6.12 TS060 et 6.09E TS470, vous pouvez aussi utiliser la macrovariable SYSDATE9 qui retourne l'année sur quatre digits.
DATA t;
input a $;
cards;
a
b
c
;
run;
%macro cration_macro_var;
DATA _null_; SET t;
call symput('var'||left(trim(_n_)),a);
call symput('nb_ligne',_n_);
run;
%do i =1 %TO &nb_ligne;
%put Valeur &i &&var&i..;
%end;
%mend;
%cration_macro_var;La fonction %SYMDEL permet la suppression d'une macrovariable spécifique. Le code ci-dessous explicite cette notion :
%LET test=Bonjour;/*Déclaration et initialisation de la macrovariable test*/
%PUT &test;/*Affichage de la macrovariable test*/
%PUT _USER_;/*On liste les macrovariables de l'utilisateur*/
%SYMDEL test;/*Suppression de la macrovariable test*/
%PUT _USER_;/*On liste les macrovariables de l'utilisateur*/En exécutant la ligne ci-dessous vous listerez toutes les macrovariables de votre session, c'est-à-dire les macrovariables de l'utilisateur et les macrovariables automatiquement générées par SAS.
%PUT _ALL_;En exécutant la ligne ci-dessous vous listerez les macrovariables générées automatiquement par SAS.
%PUT _AUTOMATIC_;En exécutant la ligne ci-dessous vous listerez les macrovariables créées par l'utilisateur.
%PUT _USER_;Les macrovariables n'ont qu'un seul type : le type caractère. L'exemple suivant illustre cette notion :
%LET v1=20;
%LET v2=10;
%LET v3=&v1-&v2;
%PUT &v3;La macrovariable "v3" est égale à la chaine de caractères 20-10 et non à 10 (l'opération 20-10).
Le caractère "&" étant un caractère privilégié de SAS, il faut utiliser une fonction spécifiant que le texte rentré dans la macrovariable comporte un caractère spécial. La macrofonction %nstr() permet ce genre de manipulation.
%let macrovariable = %NRSTR(&exemple);
%put ¯ovariable;L'instruction symget permet ce genre de manipulation. L'exemple suivant explicite son fonctionnement :
DATA base;
INPUT var1 var2;
cards ;
10 11
15 22
;
RUN;
%MACRO test();
DATA base2;
SET base;
CALL SYMPUT (COMPRESS("mavar"||left(put(_N_,4.))),var1);
varId=symget("mavar"||left(put(_N_,4.)))+2;
RUN;
%MEND test;
%test();L'instruction %PUT permet d'afficher la valeur d'une macrovariable dans la fenêtre log.
%LET maVar = Hello World;
%PUT &maVar;On aura alors Hello World d'affiché dans la fenêtre log.
À l'aide du programme ci-dessous vous pourrez lister les noms des tables contenues dans la bibliothèque test2. Créons tout d'abord la bibliothèque et les tables :
LIBNAME test2 "C:/";
DATA test2.b1;
INPUT X1 X2;
CARDS;
0 1
2 4
;
RUN;
DATA test2.b2;
INPUT X3 X4;
CARDS;
2 5
6 3
;
RUN;Pour identifier les noms des tables et leur nombre procédez comme suit :
proc sql noprint;;
SELECT trim(libname)||"."||trim(memname) INTO :liste separated BY ' '
FROM sashelp.vstable
WHERE libname = upcase("Test2");
SELECT count(*) INTO :nb_table
FROM sashelp.vstable
WHERE libname = upcase("Test2");
quit;Remarque : la description des tables est contenue dans sashelp.vstable.
On récupère les sorties dans des macrovariables :
%put Liste des TABLE &liste ;
%put Nombre de TABLE &nb_table;À l'aide de la macrofonction %str() vous pouvez stocker votre procédure SAS dans une macrovariable pour ensuite l'exécuter. Par exemple :
DATA base;
input v1;
cards;
1
2
;
RUN;
%LET test = %str(PROC PRINT DATA=base NOOBS;RUN;);
&test;Les caractères ";" et "'"étant des caractères privilégiés de SAS, il faut utiliser une fonction spécifiant que le texte rentré dans la macrovariable comporte un caractère spécial. La macrofonction %str() permet ce genre de manipulation.
%LET test=%str(Hello;);
%PUT &test;Le type des macrovariables étant le texte, il faut préciser à SAS lorsque vous voulez que celui-ci fasse le calcul demandé. Les macrofonctions %EVAL() et %SYSEVALF() permettent cette manipulation.
La différence entre les deux se situe au niveau du résultat de l'opération. Si celui-ci est un nombre entier vous utiliserez %EVAL() sinon vous utiliserez %SYSEVALF(). L'exemple suivant illustre cette notion :
%LET v1=15;
%LET v2=10;
%LET v3=%EVAL(&v1-&v2);
%PUT &v3;
%LET v4=%SYSEVALF(&v1/&v2);
%PUT &v4;


