Bonjour,
Afin d'importer tous les fichiers d'un répertoire, je suis passé par une première macro qui est ensuite appelé via un call execute.
Voici la macro :
Et voici le Call Execute :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 %macro importdata_utf8(file); options nonotes nosource; filename source "%superq(file)" encoding='utf-8'; proc import datafile = source out = %fixname(%scan(&file,-1,\)) replace dbms = dlm; delimiter = "|"; getnames = no; guessingrows=max; run; options notes source; %mend importdata_utf8;
Jusque là, tout va bien, mais ça se complique pour moi lorsque je veux compléter la macro %importdata_utf8.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 %macro finddata(folder); %global chp nb; %let folder2=%bquote("&folder\*."); filename filelist pipe "dir /b /s &folder2"; options nonotes nosource; data _null_; infile filelist truncover; input filename $100.; put filename = ; call execute(cats('%importdata_utf8(', filename, ')' )); run; options notes source; %mend finddata;
Je dispose d'une table annexe, qui, pour chaque fichier lu, me donne le nom de chaque variable le composant. Je souhaite donc m'en servir pour renommer les variables de chaque table créée dans la proc import, où les variables s'appellent pour l'instant VAR1, VAR2,...VARx.
Et voici donc la macro avec le rename :
Cette macro fonction correctement lorsque je l'appelle de façon isolée sur un fichier en particulier :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 %macro importdata_utf8_rename(file); options nonotes nosource; filename source "%superq(file)" encoding='utf-8'; proc import datafile = source out = %fixname(%scan(&file,-1,\)) replace dbms = dlm; delimiter = "|"; getnames = no; guessingrows=max; run; proc sql; select champ, nb_champ into :chp, :nb from recap_xml where filename = "%scan(&file,-1,\)"; quit; data %fixname(%scan(&file,-1,\)); set %fixname(%scan(&file,-1,\)); rename %do i = 1 %to &nb; var&i = %scan(%superq(chp),&i,",") %end;; run; options notes source; %mend importdata_utf8_rename;
=> Le fichier Occasions_201601 est lu correctement, la table Occasions_201601 est bien créée, et les variables sont bien renommées.
Code : Sélectionner tout - Visualiser dans une fenêtre à part %importdata_utf8_rename(D:\Data1\Occasions_201601)
Par contre, là est le problème, lorsque je veux appeler cette macro via le call execute, cela ne fonctionne pas correctement...
...vraisemblablement à cause des macro variables nb et chp qui ne sont pas lues, compilées, interprétées correctement et/ou au bon moment.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 %macro finddata(folder); %global chp nb; %let folder2=%bquote("&folder\*."); filename filelist pipe "dir /b /s &folder2"; options nonotes nosource; data _null_; infile filelist truncover; input filename $100.; put filename = ; call execute(cats('%importdata_utf8_rename(', filename, ')' )); run; options notes source; %mend finddata; %finddata(D:\Data1)
Si je ne me trompe pas, le problème vient bien de là, mais je ne parviens pas à trouver la bonne syntaxe pour que ces macro variables soient utilisées correctement au bon moment.
Merci de votre aide, et toute information complémentaire sera la bienvenue.
Partager