support clients /

Une macro pour lire plusieurs fichiers texte

L'importation de plusieurs fichiers texte sous SAS peut être un traitement long. Ce traitement est d'autant plus long que les fichiers à importer sont nombreux et ne possèdent pas la même structure (nombre différent de variables, ordre des variables, etc..). SAS possède beaucoup d'outils puissants qui peuvent vous aider à automatiser ce traitement.
Le but de cet article est  de présenter une solution simple pour importer un ensemble de fichiers  ne possédant pas forcément la même structure (nombre, ordre des variables différents).
La méthode présentée ci-dessous utilise uniquement le module SAS/BASE.

Exemple 

Nous souhaitons importer les deux fichiers présents dans le répertoire ‘C:\Fichiers’  au sein d’une table SAS nommée ‘total.sas7bdat’.

Premier fichier que l’on souhaite importer :

Second fichier que l’on souhaite importer :

Le premier fichier contient 5 variables non présentes dans le second fichier à savoir : var6, var8, var9, var10 et var11.
Le second fichier contient lui une variable non présente dans le premier fichier à savoir var14. Ainsi seulement les cinq premières variables apparaissent dans le même ordre dans les deux fichiers.

On souhaite obtenir la table SAS suivante :

Méthode 

1°) Récupération du nom des fichiers à importer

La première étape consiste à récupérer dans une table SAS le nom des fichiers à importer.
Pour cela l'instruction 'filename pipe' est utilisée.
Cette instruction permet d'exécuter une commande système et de récupérer son résultat dans une variable SAS.
On récupère également dans une macro variable le nombre de fichiers à importer.

Dans le programme ci–dessous, on récupère dans la table 'fichiers' tous les noms des fichiers présents dans le répertoire ' C:\Fichiers'. On récupère également dans la macro variable 'nbr_fich' le nombre de fichiers à importer.

filename fich pipe 'dir C:\Fichiers /b';

data fichiers;
    length noms $20;
    infile fich truncover;
    input noms $20.;
    call symput ('nbr_fich',_n_);
run;

On obtient :

2°) Récupération du nom des variables

La macro lir_fich va ensuite lire chaque fichier successivement à l'aide d'une boucle %do %end sur le nombre de fichiers à importer.

Pour chaque fichier on récupère le nom des variables qu'il contient. Ceci correspond à la lecture de la première ligne du fichier.

Le nom des variables est alors stocké dans une table SAS sous la forme X1 à Xn, où n correspond au nombre maximum de variables présentes dans tous les fichiers.

Dans cette macro il est nécessaire de connaître le nombre maximum de variables présentes dans tous les fichiers que l'on souhaite importer.

Le programme 'nombre_max_variables.sas' en annexe permet de récupérer ce nombre dans une macro variable nommée nbr_var.

Dans cet exemple cette macro variable vaut  17.

%macro lir_fich;

  %do j=1%to &nbr_fich; 

     data _null_;
        set fichiers;
        if _n_=&j;
        call symput ('fichier',noms);
     run;

     %let nbr_var =17 ;
     data noms_var;
         length x1-x&nbr_var.  $12;
         infile "C:\Fichiers\&fichier" obs=1 missover;
         input (x1-x&nbr_var. ) ($) ;
     run;

Lors de la lecture du premier fichier, le contenu de la table ‘noms_var’  est : 

 

Lors de la lecture du second  fichier, le contenu de la table ‘noms_var’ est :   

La macro noms_var  est ensuite utilisée pour stocker le nom des variables dans des macros variables nommées V1 à V&nbr_var.

 %macro noms_var;

      %do i=1%to &nbr_var. ;
         %global v&i;

          data _null_;
             set noms_var;
             call symput("v&i",trim(x&i));
          run;
       %end;
    %mend noms_var;

%noms_var;

3°)  Lecture des données

La macro lir_fich lit ensuite les données de chaque fichier et les récupère dans une table temporaire nommé temp.

data temp;
    infile " C:\Fichiers\&fichier" firstobs=2 missover;
    input (&v1 &v2 &v3 &v4 &v5 &v6 &v7 &v8 &v9 &v10 &v11 &v12 &v13 &v14 &v15 &v16    
    &&v&nbr_var. ) ($);
run;
 

Les fichiers sont ensuite regroupés dans une seule table nommée total. 

%if &j=1%then %do;
   data total;
       set temp;
    run;
%end;

%else %do;
   data total;
       set total
             temp;
    run;
 

%end;
%end;

%mend lir_fich;
%lir_fich;

Aurélie GENTIL 
Consultant Support Clients SAS France