FAQ SASConsultez toutes les FAQ

Nombre d'auteurs : 13, nombre de questions : 308, dernière mise à jour : 5 avril 2016  Ajouter une question

 

Cette F.A.Q., qui traite de tout type de questions portant sur l'outil SAS, a été réalisée à partir des contributions des membres des forums sas de developpez.com en vue de répondre à des questions fréquemment posées par les utilisateurs et grâce à SAS France qui a bien voulu nous donner accès à ses sources.

Si vous désirez contribuer à l'amélioration de cette F.A.Q., vous pouvez participer au billet de participation à l'enrichissement de la faq SAS , ou contacter le responsable SAS , ou contacter un des responsables de l'équipe Business Intelligence .

Nous espérons que cette F.A.Q. saura répondre à un maximum de vos questions. Nous vous souhaitons une bonne lecture.

L'équipe SAS de developpez.com remercie les contributeurs actuels : ash_rmy , bahraoui , datametric , fafabzh6 , Fleur-Anne.Blain , green_fr , oncle_pete , raf64flo , rastoix , s_a_m et steelspirit .

L'équipe SAS de developpez.com remercie aussi claudeLeloup et jacques_jean pour leurs relectures attentives de la F.A.Q. dans le but de chasser les fautes d'orthographes.


SommaireLangage Macro Macrovariables (18)
précédent sommaire suivant
 

Une macrovariable sert à stocker une information pour pouvoir la réutiliser. Une macrovariable peut être initialisée par un %LET ou par un CALL SYMPUT dans une table.

Code sas : Sélectionner tout
1
2
3
%LET maVar=base; 
PROC PRINT data=&maVar; 
RUN;
Code sas : Sélectionner tout
1
2
3
4
DATA res; 
SET base; 
CALL SYMPUT('MaVar'_N_,var); 
RUN;
Dans le dernier exemple, on va créer autant de macrovariables que de valeurs de la variable 'var'. Si 'var' prend 10 valeurs MaVar1 prendra la première valeur de var, MaVar2 prendra la 2ème valeur de var, ..., MaVarn prendra la nième valeur de var.
Il est important de signaler que les macrovariables sont des valeurs stockées en mémoire et non pas dans des tables.

Mis à jour le 1er mars 2008 fafabzh6

La fonction %SYMDEL permet la suppression d'une macrovariable spécifique. Le code ci-dessous explicite cette notion :

Code sas : Sélectionner tout
1
2
3
4
5
%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*/

Mis à jour le 27 mai 2008 fafabzh6

L'instruction %PUT permet d'afficher la valeur d'une macrovariable dans la fenêtre log.

Code sas : Sélectionner tout
1
2
%LET maVar = Hello World; 
%PUT &maVar;
On aura alors Hello World d'affiché dans la fenêtre log.

Mis à jour le 1er mars 2008 fafabzh6

Les macrovariables n'ont qu'un seul type : le type caractère. L'exemple suivant illustre cette notion :

Code sas : Sélectionner tout
1
2
3
4
%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.

Code sas : Sélectionner tout
1
2
%let macrovariable = %NRSTR(&exemple); 
%put ¯ovariable;

Mis à jour le 27 mai 2008 fafabzh6

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.

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
options symbolgen ; 
  
data _null_; 
set sashelp.class nobs=nobs ; 
call symput ("nbobs",nobs); 
run; 
  
%put "Le nombre d'observations de la table est :" &nbobs ;

Mis à jour le 10 octobre 2008 sas

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.

Code sas : Sélectionner tout
1
2
3
4
5
data _null_; 
length MONUSER $50; 
MONUSER=sysget(trim("USERNAME")); 
put MONUSER=; 
run;
Le principe est le même pour les variables Unix :

Code sas : Sélectionner tout
MAVARIABLE=sysget(trim("$HOME"));

Mis à jour le 10 octobre 2008 sas

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 :

Code sas : Sélectionner tout
1
2
3
4
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 :

Code sas : Sélectionner tout
1
2
3
4
5
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.

Mis à jour le 10 octobre 2008 sas

L'instruction CALL SYMPUT permet, dans une étape DATA, de créer des macrovariables à partir des données stockées dans une des variables de l'étape DATA.

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DATA t; 
INPUT a $; 
CARDS; 
a 
b 
c 
; 
RUN; 
%MACRO creation_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; 
%creation_macro_var;

Mis à jour le 27 mai 2008 bahraoui fafabzh6

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.

Code sas : Sélectionner tout
%PUT _ALL_;

Mis à jour le 27 mai 2008 fafabzh6

En exécutant la ligne ci-dessous vous listerez les macrovariables générées automatiquement par SAS.

Code sas : Sélectionner tout
%PUT _AUTOMATIC_;

Mis à jour le 27 mai 2008 fafabzh6

En exécutant la ligne ci-dessous vous listerez les macrovariables créées par l'utilisateur.

Code sas : Sélectionner tout
%PUT _USER_;

Mis à jour le 27 mai 2008 fafabzh6

L'instruction symget permet ce genre de manipulation. L'exemple suivant explicite son fonctionnement :

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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();

Mis à jour le 1er mars 2008 fafabzh6

À 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 :

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 :

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
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 :

Code sas : Sélectionner tout
1
2
%put Liste des TABLE &liste ; 
%put Nombre de TABLE &nb_table;

Mis à jour le 15 novembre 2011 bahraoui

À l'aide de la macrofonction %str() vous pouvez stocker votre procédure SAS dans une macrovariable pour ensuite l'exécuter. Par exemple :

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
9
DATA base; 
input v1; 
cards; 
1  
2 
; 
RUN; 
%LET test = %str(PROC PRINT DATA=base NOOBS;RUN;); 
&test;

Mis à jour le 27 mai 2008 fafabzh6

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.

Code sas : Sélectionner tout
1
2
%LET test=%str(Hello;); 
%PUT &test;

Mis à jour le 27 mai 2008 fafabzh6

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 :

Code sas : Sélectionner tout
1
2
3
4
5
6
%LET v1=15; 
%LET v2=10; 
%LET v3=%EVAL(&v1-&v2); 
%PUT &v3; 
%LET v4=%SYSEVALF(&v1/&v2); 
%PUT &v4;

Mis à jour le 27 mai 2008 fafabzh6

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2020 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.