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é !
OPTIONS COMPRESS = YES;
DATA CARS;
KEEP MAKE MODEL MSRP;
SET SASHELP.CARS;
RUN;
1
OPTIONS COMPRESS = YES;
2
3
DATA CARS;
4
KEEP MAKE MODEL MSRP;
5
SET SASHELP.CARS;
6
RUN;
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é !
DATA DVAR01;
SET CARS;
WHERE MAKE = "BMW";
RUN;
DATA DVAR02;
SET CARS;
WHERE MAKE = "BMW";
RUN;
DATA DVAR03;
SET CARS;
WHERE MAKE = "BMW";
RUN;
1
DATA DVAR01;
2
SET CARS;
3
WHERE MAKE = "BMW";
4
RUN;
5
6
DATA DVAR02;
7
SET CARS;
8
WHERE MAKE = "BMW";
9
RUN;
10
11
DATA DVAR03;
12
SET CARS;
13
WHERE MAKE = "BMW";
14
RUN;
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é !
%LET VAR1 = BMW;
DATA DVAR01;
SET CARS;
WHERE MAKE = "&VAR1.";
RUN;
/* ... Répété pour DVAR02 et DVAR03 ... */
1
%LET VAR1 = BMW;
2
3
DATA DVAR01;
4
SET CARS;
5
WHERE MAKE = "&VAR1.";
6
RUN;
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. Via %LET */
%LET VAR1 = Acura;
/* 2. Via CALL SYMPUT */
DATA _NULL_;
CALL SYMPUT("VAR2", "Acura");
RUN;
/* 3. Via PROC SQL INTO: */
PROC SQL NOPRINT;
SELECT
MAX(MAKE) INTO :VAR3
FROM CARS;
QUIT;
1
/* 1. Via %LET */
2
%LET VAR1 = Acura;
3
4
/* 2. Via CALL SYMPUT */
5
DATA _NULL_;
6
CALL SYMPUT("VAR2", "Acura");
7
RUN;
8
9
/* 3. Via PROC SQL INTO: */
10
PROC SQL NOPRINT;
11
SELECT
12
MAX(MAKE) INTO :VAR3
13
FROM CARS;
14
QUIT;
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é !
%MACRO T1;
DATA A;
A = 1;
RUN;
%MEND T1;
%T1;
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é !
%MACRO T2(V=,);
%PUT &V.;
DATA DVAR_&V.;
SET CARS;
WHERE MAKE = "&V.";
RUN;
%MEND T2;
%T2(V=BMW);
%T2(V=Acura);
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é !
%MACRO T3(V=,);
%PUT &V.;
%IF &V.= &M. %THEN %DO;
/* ... code si V correspond à la variable globale M ... */
%END;
%ELSE %DO;
/* ... code si V est différent ... */
%END;
%MEND T3;
%LET M = BMW;
%T3(V=BMW);
%T3(V=Acura);
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é !
DATA A;
DO I = 1 TO 10;
T = I + 2;
OUTPUT;
END;
RUN;
1
DATA A;
2
DO I = 1 TO 10;
3
T = I + 2;
4
OUTPUT;
5
END;
6
RUN;
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é !
%MACRO T4(V=,);
%PUT &V.;
%DO I = 0 %TO &V.;
DATA A_&I.;
SET ACCT;
WHERE MONTH = &I.;
RUN;
%END;
%MEND T4;
%T4(V=10);
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é !
%LET S = 1;
%LET I = 10;
%LET S = &S. + &I.;
/* %PUT &S.; -> Affiche '1 + 10' */
%LET S = %EVAL(&S. + &I.);
/* %PUT &S.; -> Affiche '11' */
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.
« 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. »
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.