Posts Tagged ‘infile’

Lire des données d’un fichier .TXT sans perdre d’information (les options d’INFILE)
novembre 7, 2008L’accès à des données contenues dans un fichier externe du type .TXT se fait sous SAS par l’intermédiaire d’une étape data et de l’instruction INFILE. Plusieurs options sont possibles pour cette instruction. Il est important de connaître les forces et faiblesses de chacune afin de faire le bon choix. Cet article vous présentera dans un premier temps le fichier .TXT qui servira d’exemple. En premier lieu, il sera appelé avec l’option FLOWOVER, l’option par défaut. Puis, cela sera le tour des options TRUNCOVER et MISSOVER/PAD.
1. Aperçu sur les données contenu dans le fichier .TXT
Afin de montrer les nuances entre les options FLOWOVER, TRUNCOVER et MISSOVER, un fichier EG_INFILE.TXT est créé. Ce fichier contient les données pour deux variables caractères CNTRY (country) et CNT (count).
Dans l’aperçu qui suit, j’ai remplacé les espaces par des points afin de vous puissiez visualiser la différence que peuvent créer certains espaces.
- La première ligne contient 2 caractères
- Les seconde et troisième lignes contiennent 12 caractères
- L’avant dernière ligne n’en contient que 4
- La dernière en contient 12 si on inclus les espaces de fin.
Note : « e.g. » est la version raccourcie de « example » en anglais. C’est donc notre équivalent de « ex ».
IT CA.12....... BE.123456789 KR. MY.2 FI.1........
Le choix du FILENAME : Par choix, je crée un mot SASREF qui désigne le chemin d’accès au fichier EG_INFILE.TXT. Cela évitera d’avoir à recopier le chemin dans chaque étape data. Toute mise à jour ou correction du chemin d’accès se fera en une seule fois évitant tout oubli.
filename sasref 'C:/sasref/eg_infile.txt';
Note : Il est important de définir une longueur pour les variables caractères. Sinon les variables ayant plus de 8 caractères sont tronquées. Dans notre cas, la valeur 123456789 deviendrait 12345678.
2. FLOWOVER, l’option par défaut
Par défaut, SAS applique l’option FLOWOVER avec une instruction INFILE. Ainsi l’instruction INFILE mise en commentaire, en ajoutant une étoile en tête d’instruction, donnerait le même résultat que celle active.
data eg_flowover; infile sasref; *infile sasref flowover; length cntry $2 cnt $9; input cntry $ cnt $; run;
L’aperçu qui suit montre très clairement que SAS continu sa lecture sur la ligne suivante s’il n’a pas trouvé une valeur pour chaque variable dans la ligne actuelle.
- Créer la première ligne d’observations : En ligne 1, il manque une valeur pour CNT. SAS va en ligne deux et récupère la première valeur. Il ignorera toutes les valeurs qui peuvent exister sur le reste de la ligne. Il lui a donc fallu deux lignes en entrée pour créer une ligne en sortie.
- Créer la seconde ligne d’observations : après avoir lu les deux premières lignes, SAS passe à la troisième ligne pour créer la seconde ligne d’observations. Il trouve son bonheur ici puisqu’il y a une valeur par variable.
- Créer la troisième ligne d’observations : à la ligne suivante, il manque de nouveau une valeur. SAS assigne la valeur KR à la variable CNTRY. Mais ne trouvant pas de valeur pour la variable CNT, il passe à la ligne suivante et trouve la valeur MY.
- Créer la quatrième et dernière ligne d’observations : il ne reste a SAS plus qu’une ligne de disponible dans le fichier d’entrée. Cette ligne contient une observation par variable. SAS est content avec.
cntry cnt IT CA BE 123456789 KR MY FI 1
3. L’option TRUNCOVER empêche le passage à la ligne et ne se formalise pas des longueurs
L’option TRUNCOVER palie à ce problème en empêchant à SAS d’aller voir à la ligne suivante
data eg_truncover; infile sasref truncover; length cntry $2 cnt $9; input cntry $ cnt $; run;
Le résultat est comme escompté :
cntry cnt IT CA 12 BE 123456789 KR MY 2 FI 1
4. L’option MISSOVER empêche le passage à la ligne
Les limites de l’option MISSOVER avec un INFILE : L’option MISSOVER est une autre option possible de l’instruction INFILE. Elle présente néanmoins une limite due à des espaces.
data eg_missover; infile sasref missover; length cntry $2 cnt $9; input cntry $ cnt $; run;
Dans l’exemple, la valeur de CNT (2) quand CNTRY=MY disparaît, alors quela valeur de CNT (1) quand CNTRY=FI reste. Alors que la Qu’est ce qui a provoqué cela ?
Vous souvenez vous de la remarque concernant les espaces en fin de ligne dans la première section de cette article. SAS recherche 9 caractères pour créer une valeur pour CNT. Hors quand CNTRY=MY, il n’en trouve qu’un. Cela ne le satisfait pas. Comme, avec MISSOVER, il ne peut pas aller voir sur la ligne d’après. Il se contente de mettre une valeur manquante.
cntry cnt
IT
CA 12
BE 123
KR
MY
FI 1
L’équivalent de TRUNCOVER : L’option MISSOVER en combinaison avec l’option PAD fournira le même résulat que l’option TRUNCOVER. Autant donc utiliser un seul mot en la personne de TRUNCOVER.
data eg_missover_pad; infile sasref missover pad; length cntry $2 cnt $9; input cntry $ cnt $; run;
Le cas particulier du DATALINES : MISSOVER avec un DATALINES ne rencontre pas le problème des blancs de fin de ligne manquants.
data eg_missover; infile datalines missover; length cntry $2 cnt $9; input cntry $ cnt $; datalines; IT CA 12 BE 123456789 KR MY 2 FI 1 ; run;
Conclusion
Nous avons vu un cas particulier de l’instruction INFILE : lecture d’un fichier dans lequel chaque ligne est sensée représenter une ligne d’observations.
Par défaut, SAS recherche autant d’emplacements (texte ou espaces) dans le fichier qu’il lit que celui donné par la longueur d’une variable. Faute de quoi SAS jetera un coup d’oeil à la ligne suivante (FLOWOVER) ou ignorera certaines valeurs (MISSOVER) selon l’option indiquée dans l’instruction INFILE.
L’option TRUNCOVER répond aux deux problèmes (passage à la ligne et manque de place sur une ligne). Il est donc judicieux de privilégier l’option TRUNCOVER sur MISSOVER pour ce problème précis.

Créer un data set à partir de données brutes (Line input)
septembre 25, 2008Pour créer un data set SAS de but en blanc, il est possible de saisir des données manuellement ou de lire un fichier .TXT dans une étape DATA. Selon la structure des données 4 approches sont envisageables de manière distincte ou en combinaison. Lorsque chaque observation est séparée par des espaces, on parle de l’approche LINE INPUT. Cet article donne les rudiments de la syntaxe pour LINE INPUT.
1. Un premier exemple
Dans ce premier exemple, un data set nommé ONE est créé dans la bibliothèque WORK.
4 variables : Le data set ONE contient 4 variables, 3 numériques (NUM1-NUM3) et une texte (CHAR1). Les variables NUM1 et NUM apparaissent en premier. Elles sont suivies en troisième position de la variable CHAR1 et enfin de la variable NUM3. L’ordre d’affichage des variable est fonction de l’ordre dans lequel SAS rencontre la variable pour la première fois.
2 lignes d’observations : chacune des 4 variables contient deux observations.
Le symbole dollar : Dans ce premier exemple, on notera la présence d’un symbole dollar ($) après le nom de la variable texte CHAR1. Le symbole dollar permet donc de préciser que la variable qui le précède est une variable texte.
Datalines : Pour saisir les données dans l’étape data même, il faut commencer par ajouter une instruction DATALINES. Son ancien petit nom rencontré dans les documentations plus anciennes est CARD.
Important, le point-virgule : Il est important de noter qu’un point virgule terminant l’énumération des données se situe sur une ligne séparées des données.
data one;
input num1 num2 char1 $ num3;
datalines;
1 2 A 3
4 5 AA 6
;
run;
2. Ajouter des attributs
Dans ce second exemple, une variable texte (CHAR2) et une variable numérique (NUM4) sont ajoutées.
Préciser la longueur de la variable CHAR2 : Par défaut, les observations de plus de 8 caractères sont coupées. Ainsi United-Kingdom devient United-K.Lorsqu’une nouvelle variable texte est créée, il est important de préciser sa longueur.
A quel moment définir la longueur ? : Dans le cas présent, la longueur est à définir avant l’instruction INPUT. Sinon, SAS assignera une longueur de 8 par défaut et cette valeur ne pourra pas être changée. Cela veut dire que la variable CHAR2 sera la première variable rencontrée par SAS et qu’elle apparaîtra donc en premier dans le data set. Si vous voulez changer cet ordre, définissez explictement par exemple la longueur des autres variables. Pour plus de précisions pour changer l’ordre d’affichage des variables, reportez-vous à l’article « Changer la séquence d’affichage des variables« .
Une instruction LENGTH : Pour définir une longueur de 20 octets représentant 20 caractères pour les données textes, l’instruction LENGTH est utilisée dans l’exemple. Comme il s’agit d’une variable caractère, il est important de le préciser en ajouter un symbole dollar avant le nombre 20.
data two;
length char2 $ 20;
input num1 num2 char1 $ char2 $ num3 num4;
informat num4 date9.;
format num4 date9.;
datalines;
1 2 A United-Kingdom 3 21MAR2009
4 5 AA France 6 31JAN2010
;
run;
Un informat pour interpréter les données à l’entrée dans un data set SAS : La variable NUM4 doit contenir des nombres représentant le nombre de jours écoulés depuis le 1er janvier 1960. Pour que SAS convertisse nos données, qui ont une structure de la forme JJMMMAAAA, on lui dit avec un INFORMAT.
La structure DATE9 : Dans notre cas, les 2 premier chiffres sont les jours, les 3 lettres qui suivent représentent les trois premières lettres du mois version anglaise et les 4 derniers chiffres sont l’année. Cette structure est appelée DATE9.
Un format pour interpréter les données d’un data set SAS : pour faciliter la lecture, il est possible d’afficher la date SAS (ce nombre « abstrait ») sous la structure DATE9. Pour cela, on applique un format à la variable NUM4. La valeur formatée apparaîtra par défaut dans un PROC PRINT.
3. Lire un fichier .TXT ou .DAT
Losque le nombre de données est important, il est préférable de stocker les données dans un fichier externe contenant des données brutes (.txt, .dat). Dans l’exemple qui suit, les données sont sauvegardées dans un fichier exemple_infile.txt.
L’instruction DATALINES n’est plus nécessaire à moins que vous souhaitiez ajouter des données à celles présentes dans le fichier externe.
Désigner le fichier dans un INFILE : L’instruction INFILE sert à désigner la source des données à lire. Dans cet exemple, le chemin complet d’accès au fichier est donné directement dans l’instruction INFILE entre guillemets.
data three;
infile ‘C:/sasref/exemple_infile.txt’;
length char2 $ 20;
input num1 num2 char1 $ char2 $ num3 num4;
informat num4 date9.;
format num4 date9.;
run;
Passer par un FILEREF : Il est aussi possible de donner un nom au chemin d’accès à ce fichier externe et de pointer ce fichier avec ce nom (FILEREF). Il faut alors ajouter une instruction FILENAME. En fin de programme, ce FILEREF est libéré pour une possible autre utilisation.
filename sasref ‘C:/sasref/exemple_infile.txt’;
data four;
infile sasref;
length char2 $ 20;
input num1 num2 char1 $ char2 $ num3 num4;
informat num4 date9.;
format num4 date9.;
run;
filename sasref clear;