La maîtrise du débogage en SAS sépare le simple utilisateur de l'expert, car elle repose sur une lecture analytique du journal (Log) et l'utilisation proactive d'outils de traçabilité. Ce script met en lumière l'instruction PUTLOG, un levier de diagnostic bien plus puissant qu'un simple affichage de texte. En l'utilisant pour surveiller des variables automatiques comme _N_ (compteur d'itérations) ou _ERROR_ (indicateur d'erreur binaire), vous transformez l'étape DATA en un environnement de test transparent, capable de révéler des anomalies de données invisibles au premier coup d'œil.
L'expertise technique s'exprime également dans la distinction entre erreurs de syntaxe et erreurs logiques. Alors que les fautes de frappe (comme dota au lieu de data) ou les options invalides sont immédiatement interceptées par le compilateur, les erreurs logiques — comme une valeur hors bornes — nécessitent une validation personnalisée. L'utilisation combinée de SYMGET pour lire des variables macro et de PUTLOG pour valider les plages de données (ex: height not in (12:100)) permet de créer un code "auto-nettoyant" qui ne se contente pas de s'exécuter, mais garantit la qualité de la donnée produite.
Une astuce d'expert pour aller plus loin : utilisez l'instruction PUTLOG _ALL_ lors d'un débogage complexe. Cela affichera l'intégralité du Vecteur de Données du Programme (PDV) pour l'observation en cours, vous permettant de voir exactement comment chaque variable est modifiée à chaque étape du flux. C'est la méthode ultime pour comprendre pourquoi une condition IF ne se comporte pas comme prévu.
Le script utilise les jeux de données `SASHELP.CLASS` et `SASHELP.CARS` comme sources. Il crée également des jeux de données intermédiaires (`new_student`, `class_updated`) et des variables macro (`student_name`, `height`, `weight`, `age`, `sex`) définies au début du script pour simuler des données d'entrée. Aucune donnée externe non gérée n'est utilisée.
1 Bloc de code
DATA STEP Data
Explication : Ce bloc initialise des variables macro puis crée un jeu de données nommé `new_student`. Il utilise `sashelp.class` comme base, remplace certaines variables avec les valeurs des macros (`symget` est utilisé pour les valeurs alphanumériques). Une logique conditionnelle vérifie si la valeur de la macro variable `height` est comprise entre 12 et 100. Selon le résultat, la variable `height` est soit mise à une valeur manquante, soit assignée, et un message pertinent est écrit dans le journal SAS via `PUTLOG`.
Copié !
%let student_name = Pat;
%let height = 70;
%let weight = 120;
%let age = 15;
%let sex = M;
data new_student;
set sashelp.class (obs=1);
name = symget('student_name');
weight = &weight;
age = &age.;
sex = symget('sex');
if &height. not in (12:100) then do;
height = .;
putlog "NOTE: The height is not a valid number. It has been set to missing.";
end;
else do;
height = &height.;
putlog "NOTE: The height is a valid number. It has been set to &height..";
end;
run;
1
%let student_name = Pat;
2
%let height = 70;
3
%let weight = 120;
4
%let age = 15;
5
%let sex = M;
6
7
DATA new_student;
8
SET sashelp.class (obs=1);
9
10
name = symget('student_name');
11
weight = &weight;
12
age = &age.;
13
sex = symget('sex');
14
15
IF &height. not in (12:100) THENDO;
16
height = .;
17
putlog "NOTE: The height is not a valid number. It has been set to missing.";
18
END;
19
20
ELSEDO;
21
height = &height.;
22
putlog "NOTE: The height is a valid number. It has been set to &height..";
23
END;
24
25
RUN;
2 Bloc de code
DATA STEP Data
Explication : Ce DATA step crée le jeu de données `class_updated` en concaténant `sashelp.class` et `new_student`. Il utilise ensuite `PUTLOG` pour écrire les valeurs des variables `name` et `age` de chaque observation dans le journal SAS, démontrant comment inspecter les valeurs des variables en cours d'exécution.
Copié !
data class_updated;
set sashelp.class new_student;
putlog "NOTE: Their name is " name ;
putlog "NOTE: Their Age is " age ;
run;
1
DATA class_updated;
2
SET sashelp.class new_student;
3
4
putlog "NOTE: Their name is " name ;
5
putlog "NOTE: Their Age is " age ;
6
7
RUN;
3 Bloc de code
DATA STEP Data
Explication : Ce bloc lit le jeu de données `class_updated` et applique une logique conditionnelle. Si la variable `age` est supérieure ou égale à 15, il utilise `PUTLOG` pour afficher le nom et l'âge de l'étudiant dans le journal SAS. Ceci illustre le débogage conditionnel pour cibler des observations spécifiques ou des conditions de données.
Copié !
data class_updated;
set class_updated;
if age ge 15 then do;
putlog "NOTE: Their name is " name ;
putlog "NOTE: Their Age is " age ;
end;
run;
1
DATA class_updated;
2
SET class_updated;
3
4
IF age ge 15THENDO;
5
6
putlog "NOTE: Their name is " name ;
7
putlog "NOTE: Their Age is " age ;
8
9
END;
10
11
RUN;
4 Bloc de code
DATA STEP Data
Explication : Ce DATA step lit les 5 premières observations de `class_updated`. Il utilise `PUTLOG` pour afficher les valeurs des variables automatiques `_N_` (le numéro de l'itération actuelle du DATA step), `name` (la variable du jeu de données), et `_ERROR_` (un indicateur d'erreur, 1 si une erreur s'est produite dans l'observation actuelle, 0 sinon). C'est une technique courante pour déboguer le flux d'exécution et identifier les erreurs au niveau des observations.
Copié !
data class_updated;
set class_updated (obs=5);
putlog _N_ ;
putlog name;
putlog _ERROR_ ;
run;
1
DATA class_updated;
2
SET class_updated (obs=5);
3
4
putlog _N_ ;
5
putlog name;
6
putlog _ERROR_ ;
7
8
9
RUN;
5 Bloc de code
DATA STEP Data
Explication : Ce bloc présente un exemple d'erreur de syntaxe due à un mot-clé mal orthographié. Le mot-clé `dota` est utilisé au lieu de `data`, ce qui entraînera une erreur de compilation dans le journal SAS. Il démontre une erreur typique qui peut être diagnostiquée par l'analyse du journal.
Copié !
dota mycars;
set sashelp.cars;
run;
1
dota mycars;
2
SET sashelp.cars;
3
RUN;
6 Bloc de code
DATA STEP Data
Explication : Ce bloc illustre une erreur de syntaxe causée par l'utilisation d'une option invalide (`notvalidoption`) dans l'instruction `SET`. SAS générera une erreur dans le journal, indiquant que l'option spécifiée n'est pas reconnue ou n'est pas applicable, soulignant l'importance de connaître les options valides pour chaque instruction.
Copié !
data mycars;
set sashelp.cars(notvalidoption=this);
run;
1
2
DATA mycars;
3
SET sashelp.cars(notvalidoption=this);
4
RUN;
5
7 Bloc de code
DATA STEP Data
Explication : Ce bloc montre un exemple où un point-virgule est implicitement manquant (le commentaire original l'indique). Dans un vrai scénario, si le point-virgule après `set sashelp.cars` était omis, SAS signalerait une erreur de syntaxe, car chaque instruction SAS doit se terminer par un point-virgule. Cela met en évidence une erreur de syntaxe très courante.
Copié !
data mycars;
set sashelp.cars;
run;
1
DATA mycars;
2
SET sashelp.cars;
3
RUN;
L'Astuce Pro
Pour deboguer efficacement vos etapes DATA, privilégiez l utilisation de l instruction PUTLOG ALL plutot que l affichage manuel de variables individuelles : cette commande affiche instantanément dans le journal toutes les variables de la table ainsi que les variables automatiques N (numero d iteration) et ERROR (indicateur d erreur), vous permettant de reperer une corruption de donnees ou un comportement logique inattendu sans risquer d oublier une variable cle dans votre analyse.
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.
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.