Publié le :
Macro MIXTE

Exemples de Programmation et Macros SAS

En attente de validation
Ce script présente une série de blocs de code SAS© indépendants qui démontrent diverses techniques. Il commence par la manipulation de base des données (copie et filtrage de la table SASHELP.CARS), puis explore en profondeur trois méthodes pour créer des macro-variables : %LET, CALL SYMPUT dans un DATA STEP, et SELECT INTO: de PROC SQL. Le script se concentre ensuite sur la définition et l'appel de macros, simples ou paramétrées, en intégrant de la logique conditionnelle (%IF/%THEN/%DO) et des boucles (%DO) pour générer dynamiquement des étapes DATA. Il aborde également la portée des variables (locales/globales) et termine en illustrant la nécessité de la fonction %EVAL pour réaliser des opérations arithmétiques avec des macro-variables.
Analyse des données

Type : MIXTE


Les données proviennent principalement de la bibliothèque SASHELP (table CARS). Une table (ACCT) est également créée en interne à l'aide d'une instruction CARDS pour illustrer une boucle macro.

1 Bloc de code
DATA STEP Data
Explication :
Ce bloc crée une table de travail nommée 'CARS' en copiant les colonnes MAKE, MODEL, et MSRP de la table 'CARS' située dans la bibliothèque SASHELP. L'option COMPRESS=YES est activée pour réduire l'espace de stockage de la table.
Copié !
1OPTIONS COMPRESS = YES;
2 
3DATA CARS;
4KEEP MAKE MODEL MSRP;
5SET SASHELP.CARS;
6RUN;
2 Bloc de code
DATA STEP Data
Explication :
Ce bloc illustre le filtrage de données. Trois tables de travail (DVAR01, DVAR02, DVAR03) sont créées, chacune contenant uniquement les enregistrements de la table 'CARS' où la marque ('MAKE') est 'BMW'. La valeur de filtrage est codée en dur.
Copié !
1DATA DVAR01;
2SET CARS;
3WHERE MAKE = "BMW";
4RUN;
5 
6DATA DVAR02;
7SET CARS;
8WHERE MAKE = "BMW";
9RUN;
10 
11DATA DVAR03;
12SET CARS;
13WHERE MAKE = "BMW";
14RUN;
3 Bloc de code
DATA STEP Data
Explication :
Ce bloc améliore le précédent en utilisant une macro-variable 'VAR1' pour stocker la valeur de filtrage 'BMW'. Le code est plus flexible car il suffit de changer la ligne %LET pour filtrer sur une autre marque. &VAR1. est résolu par le pré-processeur macro avant l'exécution du DATA STEP.
Copié !
1%LET VAR1 = BMW;
2 
3DATA DVAR01;
4SET CARS;
5WHERE MAKE = "&VAR1.";
6RUN;
7 
8/* ... Répété pour DVAR02 et DVAR03 ... */
4 Bloc de code
DATA STEP Data
Explication :
Ce bloc présente trois méthodes fondamentales pour créer des macro-variables : 1) `%LET` pour une assignation statique. 2) `CALL SYMPUT` dans un DATA STEP pour créer une macro-variable à partir d'une valeur calculée ou lue dans une table. 3) `SELECT ... INTO:` dans PROC SQL pour affecter le résultat d'une requête directement à une ou plusieurs macro-variables.
Copié !
1/* 1. Via %LET */
2%LET VAR1 = Acura;
3 
4/* 2. Via CALL SYMPUT */
5DATA _NULL_;
6 CALL SYMPUT("VAR2", "Acura");
7RUN;
8 
9/* 3. Via PROC SQL INTO: */
10PROC SQL NOPRINT;
11SELECT
12 MAX(MAKE) INTO :VAR3
13FROM CARS;
14QUIT;
5 Bloc de code
MACRO Data
Explication :
Définition et appel d'une macro simple nommée 'T1'. Cette macro ne prend aucun paramètre et encapsule un DATA STEP qui crée une table 'A' avec une seule observation. L'appel `%T1;` exécute le code contenu dans la macro.
Copié !
1%MACRO T1;
2 DATA A;
3 A = 1;
4 RUN;
5%MEND T1;
6 
7%T1;
6 Bloc de code
MACRO Data
Explication :
Ce bloc définit une macro paramétrée 'T2' avec un paramètre 'V'. La macro génère dynamiquement un nom de table (`DVAR_&V.`) et filtre les données en fonction de la valeur de 'V'. Elle est ensuite appelée deux fois avec des valeurs différentes ('BMW' et 'Acura'), démontrant la réutilisabilité du code.
Copié !
1%MACRO T2(V=,);
2 %PUT &V.;
3 
4 DATA DVAR_&V.;
5 SET CARS;
6 WHERE MAKE = "&V.";
7 RUN;
8%MEND T2;
9 
10%T2(V=BMW);
11%T2(V=Acura);
7 Bloc de code
MACRO
Explication :
Cet exemple montre l'utilisation de la logique conditionnelle au sein d'une macro. La macro 'T3' compare son paramètre 'V' à une macro-variable globale 'M'. Selon que la condition `%IF` est vraie ou fausse, un bloc de code différent (`%DO; ... %END;`) est exécuté.
Copié !
1%MACRO T3(V=,);
2 %PUT &V.;
3 
4 %IF &V.= &M. %THEN %DO;
5 /* ... code si V correspond à la variable globale M ... */
6 %END;
7 %ELSE %DO;
8 /* ... code si V est différent ... */
9 %END;
10 
11%MEND T3;
12 
13%LET M = BMW;
14%T3(V=BMW);
15%T3(V=Acura);
8 Bloc de code
DATA STEP Data
Explication :
Utilisation d'une boucle `DO` standard dans un DATA STEP. Ce code crée la table 'A' avec 10 observations. Pour chaque itération de la boucle, la valeur de 'I' est incrémentée, une nouvelle variable 'T' est calculée, et l'instruction `OUTPUT` écrit explicitement l'observation courante dans la table.
Copié !
1DATA A;
2DO I = 1 TO 10;
3 T = I + 2;
4 OUTPUT;
5END;
6RUN;
9 Bloc de code
MACRO Data
Explication :
Cet exemple combine une macro avec une boucle macro `%DO`. La macro 'T4' accepte un entier 'V' et exécute une boucle de 0 à 'V'. À chaque itération, elle génère un DATA STEP complet qui crée une nouvelle table (`A_&I.`) en filtrant les données pour un mois spécifique.
Copié !
1%MACRO T4(V=,);
2 %PUT &V.;
3 
4 %DO I = 0 %TO &V.;
5 DATA A_&I.;
6 SET ACCT;
7 WHERE MONTH = &I.;
8 RUN;
9 %END;
10%MEND T4;
11 
12%T4(V=10);
10 Bloc de code
MACRO
Explication :
Ce bloc crucial illustre le traitement des expressions arithmétiques par le processeur macro. Sans `%EVAL`, l'assignation `%LET S = &S. + &I.;` traite les valeurs comme du texte et concatène les chaînes de caractères. La fonction `%EVAL()` est nécessaire pour forcer l'évaluation de l'expression arithmétique et obtenir le résultat numérique (11).
Copié !
1%LET S = 1;
2%LET I = 10;
3 
4%LET S = &S. + &I.;
5/* %PUT &S.; -> Affiche '1 + 10' */
6 
7%LET S = %EVAL(&S. + &I.);
8/* %PUT &S.; -> Affiche '11' */
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
Banner
Le Conseil de l'Expert
Expert
Michael
Responsable de l'infrastructure Viya.
« Ce script démontre les piliers de l'automatisation SAS :

L'assignation dynamique : Utiliser CALL SYMPUT pour faire remonter des informations du jeu de données vers le processeur macro.

L'encapsulation : Utiliser des macros pour isoler des tâches répétitives.

L'arithmétique macro : Ne jamais oublier %EVAL pour les nombres entiers (ou %SYSEVALF pour les décimaux), car par défaut, SAS concatène le texte au lieu d'additionner les valeurs.

En suivant ces patterns, vous réduisez le risque d'erreurs manuelles et facilitez grandement la relecture de vos programmes par vos pairs. »