FAQ SASConsultez toutes les FAQ
Nombre d'auteurs : 14, nombre de questions : 232, dernière mise à jour : 20 décembre 2012
- 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;