Introduction aux variables Macro : Arrêtez de copier-coller comme un humain

Cet article en deux mots :

Marre de modifier vos programmes à la main ? Plongez dans l'automatisation avec le langage Macro SAS et apprenez à coder des scripts qui s'écrivent tout seuls. De la déclaration de variables avec %LET aux subtilités du double && pour la résolution indirecte, ce guide pratique vous donne les clés techniques indispensables pour réussir votre certification SAS Advanced et optimiser vos flux de données comme un pro.

Skynet vient de faire une découverte affligeante. Ses sous-routines d'analyse temporelle sont pleines de code codé en dur. Quand la cible prioritaire est passée de "Sarah Connor" en 1984 à "John Connor" en 1991, il a fallu qu'un algorithme de maintenance parcoure 4 500 programmes SAS pour remplacer manuellement les noms et les dates. Une vraie tâche de stagiaire humain.

Il est temps de passer à la vitesse supérieure pour la certification SAS 9 Advanced. Bienvenue dans le monde merveilleux du Langage Macro SAS.

Le principe de base du langage Macro est simple : c'est un programme qui écrit des programmes. Avant même que votre étape DATA ou votre PROC SQL ne soit compilée et exécutée, le processeur Macro passe en revue votre code, cherche des instructions spécifiques, et fait du "chercher-remplacer" intelligent.

Commençons par la brique fondamentale : les variablesColonnes d'une table SAS contenant des données spécifiques (numériques ou caractères). Elles possèdent des attributs comme le nom, le type, la longueur, l'étiquette et le format d'affichage. Macro.

1. %LET : Déclarer vos variablesColonnes d'une table SAS contenant des données spécifiques (numériques ou caractères). Elles possèdent des attributs comme le nom, le type, la longueur, l'étiquette et le format d'affichage. stratégiques

Une variable Macro n'est pas une variable SAS classique. Elle ne vit pas dans une table, elle vit dans une zone mémoireGemini said
Espace de stockage temporaire (RAM) utilisé par le moteur CAS pour charger et traiter les données à haute vitesse, minimisant les accès disque pour optimiser les performances de SAS Viya.
appelée la Global Symbol Table. Elle contient uniquement du texte (même si ce texte représente un chiffre) et sa longueur maximale est de 65 534 caractères.

Pour créer une variable macro, on utilise l'instruction %LET.

SAS


1
2
3
4
/* Skynet définit ses paramètres globaux de mission */
%let cible = Sarah Connor;
%let annee_saut = 1984;
%let modele_actif = T-800;

Astuce Certification : Remarquez qu'il n'y a pas de guillemets autour de "Sarah Connor". Dans le monde Macro, tout est texte par défaut. Si vous mettez des guillemets dans un %LET, ils feront partie intégrante de la valeur stockée !

2. L'esperluette (&) : Déclencher le remplacement

Maintenant que nos variablesColonnes d'une table SAS contenant des données spécifiques (numériques ou caractères). Elles possèdent des attributs comme le nom, le type, la longueur, l'étiquette et le format d'affichage. sont stockées, comment dire à SAS de les utiliser dans notre code habituel ? En utilisant le symbole & (esperluette) collé au nom de la variable.

Lorsque le processeur Macro voit un &, il va chercher la valeur correspondante dans la Symbol Table et la remplace.

SAS


1
2
3
4
5
6
proc sql;
select Matricule, Statut
from work.deploiement_securise
where Cible = "&cible"
and Annee = &annee_saut;
quit;

Le piège mortel de l'examen : Regardez bien la clause WHERE. J'ai entouré &cible de guillemets doubles ("). En SAS, le processeur Macro ignore totalement tout ce qui se trouve entre guillemets simples (' ').

  • Si vous écrivez '&cible', SAS cherchera littéralement quelqu'un qui s'appelle "&cible".
  • Si vous écrivez "&cible", SAS le traduira par "Sarah Connor".

3. Le point (.) : Le délimiteur indispensable

Parfois, Skynet a besoin de concaténer (coller) une variable Macro avec du texte normal. Imaginons que nous voulions appeler une table qui s'appelle Missions_1984.

SAS


1
2
3
/* Ceci va créer une erreur */
proc print data=work.Missions_&annee_saut;
run;

Pourquoi ça plante ? Parce que SAS pense que la variable macro s'appelle &annee_saut;. Pour indiquer clairement où s'arrête le nom de la variable, on utilise un point ..

SAS


1
2
3
/* Ceci fonctionne parfaitement */
proc print data=work.Missions_&annee_saut.;
run;

Le point est consommé par le processeur Macro et disparaît. Et si vous voulez vraiment un point dans votre texte final (par exemple pour une extension de fichier) ? Il faut mettre deux points ! &annee_saut..txt deviendra 1984.txt.

4. L'inception : Le double && (Indirect Referencing)

Accrochez-vous à vos processeurs neuronaux, on entre dans le domaine favori des concepteurs de la certification : la résolution indirecte.

Skynet gère désormais plusieurs cibles.

SAS


1
2
3
4
5
6
%let cible_1 = Sarah Connor;
%let cible_2 = John Connor;
%let cible_3 = Kate Brewster;

/* Variable qui indique la cible prioritaire actuelle */
%let index_priorite = 2;

Comment demander à SAS d'afficher la cible numéro 2, de manière dynamique ? Si vous écrivez &cible_&index_priorite, SAS va paniquer. Il faut utiliser la règle du double esperluette (&&).

Le processeur Macro lit le code de gauche à droite, et applique une règle simple : && se transforme en &. Ensuite, il fait un deuxième passage s'il reste des esperluettes.

SAS


1
2
/* Afficher la cible prioritaire dans la log */
%put La cible actuelle est : &&cible_&index_priorite;

Le scan de Skynet (Comment SAS le lit) :

  1. Premier passage : && devient &. cible_ reste cible_. &index_priorite devient 2. Résultat temporaire en mémoireGemini said
    Espace de stockage temporaire (RAM) utilisé par le moteur CAS pour charger et traiter les données à haute vitesse, minimisant les accès disque pour optimiser les performances de SAS Viya.
    : &cible_2.
  2. Deuxième passage : SAS voit &cible_2, il cherche sa valeur et trouve John Connor.

C'est une technique redoutable pour boucler sur des listes de variablesColonnes d'une table SAS contenant des données spécifiques (numériques ou caractères). Elles possèdent des attributs comme le nom, le type, la longueur, l'étiquette et le format d'affichage. de manière dynamique.

Conclusion

Vous venez de faire vos premiers pas dans l'automatisation. Grâce au %LET, vous pouvez centraliser les paramètres de vos programmes. Il suffit de changer une ligne en haut de votre script pour que tout le reste s'adapte.

Mais pour l'instant, Skynet doit écrire ses variablesColonnes d'une table SAS contenant des données spécifiques (numériques ou caractères). Elles possèdent des attributs comme le nom, le type, la longueur, l'étiquette et le format d'affichage. macro à la main. Et s'il pouvait lire une table de données, et créer les variablesColonnes d'une table SAS contenant des données spécifiques (numériques ou caractères). Elles possèdent des attributs comme le nom, le type, la longueur, l'étiquette et le format d'affichage. macro automatiquement en fonction de ce qu'il y trouve ? C'est ce que nous verrons dans l'Article 7, avec le duo de choc : CALL SYMPUTX et la clause INTO !

Nicolas Housset

Passionné d'informatique, je suis Consultant et expert technique SAS VIYA, également co-fondateur de la société Flexcelite. Spécialisé dans les technologies SAS (Viya, 9.4) et les infrastructures associées (Linux, Hadoop, Azure), ce blog est mon espace pour partager mes mémos techniques et retours d'expérience.