Data Step

Comprendre l'Output Implicite vs Explicite

Simon 7 Aufrufe

La différence entre l'écriture implicite et explicite (OUTPUT) est souvent source de confusion pour les débutants, pourtant c'est ce qui donne au Data Step toute sa puissance.

Sur les forums, la question revient souvent : "Je comprends la théorie, mais quand dois-je utiliser l'un ou l'autre ?"

Voici une explication claire basée sur les réponses d'experts, illustrant comment prendre le contrôle du cycle d'écriture de SAS©.

Note :
Le Comportement par Défaut : L'Output Implicite
Pour bien comprendre, il faut visualiser ce que SAS© fait "en coulisses" lors d'une étape Data classique.

Par défaut, chaque étape Data possède une instruction de sortie implicite (automatique) à la toute fin du code, juste avant le RUN. Le cycle se déroule ainsi :

SAS© lit une observation.

Il exécute vos calculs.

Il écrit la ligne dans la table de sortie (Output Implicite).

Il vide le PDV (Program Data Vector) et remonte au début pour lire l'observation suivante.

C'est pour cela que vous n'avez pas besoin d'écrire OUTPUT pour une copie simple :
1DATA test;
2 SET SOURCE;
3 /* L'output se fait tout seul ici ! */
4RUN;
Note :
Prendre le Contrôle : L'Output Explicite
Dès que vous écrivez le mot-clé OUTPUT (ou OUTPUT nom_table) quelque part dans votre étape Data, vous désactivez l'output implicite automatique.

SAS© considère alors que vous prenez les commandes : il n'écrira une ligne que si et quand vous lui dites de le faire.

Cela ouvre la porte à deux cas d'usage majeurs expliqués dans la discussion :

Cas A : La Dispatching (Répartir les données)
Comme l'explique Cathy, c'est indispensable pour diviser une table en plusieurs sous-tables en une seule lecture ("one pass").

Sans OUTPUT explicite, SAS© enverrait chaque ligne dans toutes les tables. Avec OUTPUT, vous dirigez le flux :
1DATA hommes femmes;
2 SET demog;
3 IF sexe = 'M' THEN OUTPUT hommes; /* Écrit seulement dans la table HOMMES */
4 ELSE IF sexe = 'F' THEN OUTPUT femmes; /* Écrit seulement dans la table FEMMES */
5RUN;
Note :
Cas B : L'Agrégation et le Filtrage (Contrôler la fréquence d'écriture)
Le second expert montre comment réduire le nombre de lignes (aggrégation) sans utiliser de procédure statistique (PROC MEANS).

L'idée est de faire des calculs ligne par ligne (sommes, compteurs), mais de n'écrire le résultat qu'à la fin d'un groupe (quand last.variable est vrai).
1DATA synthese;
2 SET ventes;
3 BY produit; /* Nécessaire pour utiliser first. et last. */
4
5 /* Accumulation des sommes... */
6 IF first.produit THEN total = 0;
7 total + montant;
8 
9 /* On écrit SEULEMENT quand le groupe est fini */
10 IF last.produit THEN OUTPUT;
11RUN;
Dans cet exemple :

Si vous aviez laissé l'output implicite, vous auriez eu une ligne de sortie pour chaque ligne d'entrée (avec des totaux partiels).

Avec l'output explicite conditionnel (if ... then output), vous n'obtenez qu'une ligne par produit.

Résumé : La règle d'or

TypeDescriptionQuand l'utiliser ?
ImpliciteAutomatique à la fin du step.Pour des transformations simples (1 ligne entrée = 1 ligne sortie).
ExpliciteManuel via l'instruction OUTPUT. Désactive l'automatisme.Pour éclater des données (1 vers N tables), multiplier des lignes (1 vers N lignes) ou agréger (N vers 1 ligne).

Note technique : Un autre usage fréquent mentionné est le "parsing" de fichiers complexes. Si un fichier texte contient des entêtes, des détails et des pieds de page mélangés, l'output explicite permet d'envoyer les entêtes dans une table A et les détails dans une table B, le tout en une seule lecture.