Call Execute & Macro Variable
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 :
Code:
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; |
Et voici le Call Execute :
Code:
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; |
Jusque là, tout va bien, mais ça se complique pour moi lorsque je veux compléter la macro %importdata_utf8.
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 :
Code:
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; |
Cette macro fonction correctement lorsque je l'appelle de façon isolée sur un fichier en particulier :
Code:
%importdata_utf8_rename(D:\Data1\Occasions_201601)
=> Le fichier Occasions_201601 est lu correctement, la table Occasions_201601 est bien créée, et les variables sont bien renommées.
Par contre, là est le problème, lorsque je veux appeler cette macro via le call execute, cela ne fonctionne pas correctement...
Code:
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) |
...vraisemblablement à cause des macro variables nb et chp qui ne sont pas lues, compilées, interprétées correctement et/ou au bon moment.
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.