Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macro Discussion :

Call Execute & Macro Variable


Sujet :

Macro

  1. #1
    Membre régulier
    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 :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;


    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
    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 :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;


    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
    %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 :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)


    ...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.

  2. #2
    Membre régulier
    En continuant mes tests et mes recherches, voici ce que j'ai trouvé : Rajouter %nrstr dans l'appel de la macro d'import via le call execute.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    call execute(cats('%nrstr(%importdata_utf8_rename(', filename, '))' ));


    Et cela semble effectivement bien marcher. Alors tant mieux mais c'est plus au hasard des tests que par réelle compréhension...
    Cela ressemble bien à un problème de compilation / exécution et de résolution des macros variables.
    Mais si quelqu'un pouvait m'expliquer le pourquoi du comment sur mon exemple, ou m'indiquer une publication claire sur ce sujet, je lui en serais grandement reconnaissant !

    Merci.

###raw>template_hook.ano_emploi###