2017-03-08 4 views
0

J'essaie d'obtenir la liste des fichiers dans un répertoire avec une macro SAS qui utilise une variable macro pour spécifier dynamiquement le nom du dossier. Le code que je lance est le suivant:en utilisant macro variable pour lire le contenu du dossier dans SAS 9.4

%macro veicolo(codice_veicolo); 

filename pipedir pipe ' dir "some_path\&codice_veicolo" /S' lrecl=5000; 

data &codice_veicolo; 
infile pipedir truncover; 
input line $char1000.; 
length directory $1000; 
retain directory; 
if line =' ' or 
index(upcase(line),'<DIR>') or 
left(upcase(line))=:'VOLUME' then 
delete; 
if left(upcase(line))=:'DIRECTORY OF' then 
directory=left(substr(line,index(upcase(line),'DIRECTORY OF')+12)); 
if left(upcase(line))=:'DIRECTORY OF' then 
delete; 
if input(substr(line,1,10),?? mmddyy10.) = . then 
substr(line,1,10)='12/31/2999'; 
date=input(substr(line,1,10),?? mmddyy10.); 
format date mmddyy10.; 
run; 

proc sort data=&codice_veicolo; 
by directory descending date; 
run; 

data folder_&codice_veicolo(drop=i line); 
set &codice_veicolo; 
by directory; 
length filename $75; 
retain number_of_files_in_directory directory_size; 
if first.directory then 
do; 
number_of_files_in_directory=input(scan(line,2,' '),32.); 
call symput(nfiles,number_of_files_in_directory); 
directory_size=input(scan(line,4,' '),comma32.); 
end; 
file_size=input(scan(line,3,' '),comma32.); 
filename=' '; 
do i=4 to 100; 
filename=trim(left(filename))||' '||scan(line,i,' '); 
if scan(line,i,' ')=' ' then 
leave; 
end; 
if index(upcase(line),'FILE(S)') then 
delete; 
if date ge '30DEC2999'd then 
delete; 


run; 


%mend; 

Lorsque j'exécute la macro avec l'argument codice_veicolo étant le nom du dossier que je veux rechercher, je reçois l'erreur suivante:

Output Err std: 
The system cannot find the path specified. 
NOTE: 20 records were read from the infile PIPEDIR. 
     The minimum record length was 0. 
     The maximum record length was 90. 
NOTE: The data set WORK.JL6AME1A6FK000442 has 2 observations and 3 variables. 
NOTE: DATA statement used (Total process time): 
     real time   0.05 seconds 
     cpu time   0.01 seconds 

Je croyais que, pour une raison quelconque, il ne pouvait pas résoudre la variable macro, mais si je lance:

%let pgmpath = %sysfunc(pathname(pipedir)); 
%put &pgmpath; 

Je reçois le bon chemin et le répertoire approprié, donc je suppose que le problème est en t La déclaration d'inférence. Le code fonctionne correctement sans utiliser de variables de macro. J'utilise SAS 9.4 sur Windows 8. Des idées?

Merci d'avance :) Luca

Répondre

1

références variables macro ne sont pas dilatés à l'intérieur des guillemets simples. Essayez ceci à la place.

filename pipedir pipe %sysfunc(quote(dir /s "some_path\&codice_veicolo")) lrecl=5000; 
+0

Brilliant! Cela fonctionne bien: D Merci beaucoup! –