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

  1. #1
    Membre régulier
    Inscrit en
    juillet 2009
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : juillet 2009
    Messages : 147
    Points : 73
    Points
    73

    Par défaut 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
    Inscrit en
    juillet 2009
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : juillet 2009
    Messages : 147
    Points : 73
    Points
    73

    Par défaut

    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Règles execution des macro-variables
    Par Saetta dans le forum Macro
    Réponses: 2
    Dernier message: 07/01/2014, 09h51
  2. Réponses: 2
    Dernier message: 21/01/2010, 17h02
  3. call symput et macro-variable
    Par fafabzh6 dans le forum Macro
    Réponses: 2
    Dernier message: 11/12/2009, 10h15
  4. Réponses: 2
    Dernier message: 04/12/2009, 14h34
  5. Réponses: 5
    Dernier message: 10/07/2009, 16h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo