SAS9

Comment tester efficacement une valeur manquante dans une macro variable SAS ?

Simon 5 Aufrufe

L'une des confusions les plus fréquentes lors de l'apprentissage du langage Macro SAS© réside dans la gestion des valeurs manquantes. Contrairement à l'étape Data où un point (.) représente une valeur numérique manquante, le macro processeur traite tout comme du texte.

Cet article vous explique comment distinguer une macro variable vide (null) d'une macro variable contenant un point, et comment effectuer ces tests correctement.

Comment tester efficacement une valeur manquante dans une macro variable SAS ? -

Le piège courant : le point (.) vs le vide

Il est crucial de comprendre la nature de votre variable :

  1. Macro variable vide (Null) : Elle ne contient aucun caractère.

    • Exemple : %let maVar = ;

  2. Macro variable contenant un point : Elle contient le caractère ".". Pour le macro processeur, c'est une chaîne de caractères de longueur 1, pas une valeur manquante.

    • Exemple : %let maVar = .;

Si vous testez %if &maVar = ., vous vérifiez littéralement si la variable contient le caractère "point", et non si elle est vide.

Méthode 1 : Utiliser la fonction %LENGTH (Recommandée)

La méthode la plus robuste pour vérifier si une macro variable est "vide" ou "null" est de tester sa longueur.

Pour vérifier si une variable est vide :

1%IF %LENGTH(&maVar) = 0 %THEN %DO;
2 
3%put La variable est vide.;
4 
5%END;
6 

Pour vérifier si une variable contient une valeur (non-vide) :

Cette syntaxe fonctionne car en SAS©, tout nombre différent de 0 est évalué comme "Vrai" (True).

1%IF %LENGTH(&maVar) %THEN %DO;
2 
3%put La variable contient quelque chose (longueur > 0).;
4 
5%END;
6 
Attention : Si %let a = .;, alors %length(&a) vaut 1. Le test ci-dessus considérera donc que la variable n'est pas vide.

Méthode 2 : La comparaison directe

Une autre méthode courante consiste à comparer la variable à une chaîne vide.

1%IF &maVar = %THEN %DO;
2 
3%put La variable est vide.;
4 
5%END;
6 
Note : Cette méthode est parfois moins lisible que l'utilisation de %length, mais elle est fonctionnelle.

Erreurs de syntaxe fréquentes à éviter

Lors de l'écriture de ces conditions, attention à la structure de vos blocs %if / %then / %else.

L'erreur du point-virgule après %else

Une erreur classique consiste à placer un point-virgule immédiatement après le %else, ce qui termine l'instruction prématurément.

Note :
Incorrect :
1/* Le point-virgule après %else empêche l'exécution du bloc suivant */
2%IF %LENGTH(&a) %THEN %DO;
3 %put Existe;
4%END;
5%ELSE;
6 %put N'existe pas;
Note :
Correct :
1%IF %LENGTH(&a) %THEN %DO;
2 %put Existe;
3%END;
4%ELSE %DO;
5 %put N'existe pas;
6%END;
  • Le macro langage manipule du texte.

  • Un point (.) est un caractère, pas une valeur manquante au sens macro.

  • Utilisez %if %length(&var) = 0 pour tester une valeur nulle (vide).

  • Pour approfondir le sujet des valeurs manquantes et logiques dans les macros, les travaux de Chung et King sur le sujet sont des références techniques solides.