SAS9

MISSOVER vs TRUNCOVER, le match final

Simon 12 vistas

Lors de l'importation de fichiers textes bruts (via DATA STEP et INFILE), il arrive souvent que les lignes n'aient pas toutes la même longueur. Par défaut, SAS© a un comportement dangereux : s'il n'arrive pas à lire une variable jusqu'au bout, il saute à la ligne suivante pour continuer (option FLOWOVER).

Pour empêcher cela, deux options existent : MISSOVER et TRUNCOVER. Beaucoup pensent qu'elles sont interchangeables. Or, il existe une différence critique qui peut fausser vos données.

1. Le Scénario du Crash

Imaginez que vous demandiez à SAS© de lire 5 caractères à partir de la position 18. INPUT @18 code $5.;

Mais, votre ligne de données est plus courte que prévu : elle s'arrête à la position 20.

  • SAS© a besoin des positions : 18, 19, 20, 21, 22.

  • Le fichier contient : 18, 19, 20 (fin de ligne).

Il manque donc 2 caractères pour satisfaire la demande. C'est ici que le choix de l'option change tout.

2. MISSOVER : "Tout ou Rien"

L'option MISSOVER (Missing Over) est stricte. Si SAS© ne trouve pas la totalité des caractères demandés par le format, il considère que la lecture est impossible pour cette variable.

  • Comportement : "Tu m'as promis 5 caractères, je n'en vois que 3. Je ne prends rien."

  • Résultat : La variable est mise à valeur manquante (Missing).

  • Risque : Vous perdez l'information partielle présente en fin de ligne (les caractères 18, 19 et 20 sont ignorés).

3. TRUNCOVER : "Prends ce qu'il y a"

L'option TRUNCOVER (Truncated Over) est flexible. Si la ligne se termine avant la fin du format, SAS© récupère tout ce qu'il trouve jusqu'au saut de ligne.

  • Comportement : "Je voulais 5 caractères, tu n'en as que 3 ? Pas grave, donne-moi les 3."

  • Résultat : La variable contient la valeur partielle (les caractères aux positions 18-20).

  • Avantage : Aucune donnée n'est perdue.

4. Exemple Comparatif

Code SAS© :

1DATA test;
2 INFILE DATALINES missover; /* Testez ensuite avec truncover */
3 INPUT @1 nom $5.;
4 DATALINES;
5ABCDE
6ABC
7;
8RUN;
Donnée brute (Ligne)Longueur réelleOption MISSOVEROption TRUNCOVER
ABCDE5"ABCDE""ABCDE"
ABC3(Vide)"ABC"
L'analyse de l'expert : TRUNCOVER gère les "données partielles". MISSOVER déclare forfait si la longueur est insuffisante. Si la ligne était encore plus courte (ex: arrêt à la position 16 alors qu'on commence à lire à 18), les deux options renverraient une valeur manquante.

5. Pourquoi cette confusion historique ?

  • Sur les vieux Mainframes, les fichiers avaient souvent des longueurs fixes et rigides. Les lignes incomplètes étaient rares.

  • Sur Windows et Unix, les fichiers sont à longueur variable (délimités par des retours chariot). Il est très fréquent qu'une ligne soit plus courte que les autres (ex: adresse vide en fin de ligne).

La recommandation moderne est sans appel : Utilisez presque toujours TRUNCOVER.

C'est l'option la plus sûre pour lire des fichiers à longueur variable (CSV complexes, fichiers plats positionnels) sans risquer de perdre les données situées en toute fin de ligne. MISSOVER ne doit être utilisé que si vous avez une raison spécifique de rejeter les données partielles.