2017-03-08 14 views
0

マクロ変数を使用して動的にフォルダ名を指定するSASマクロを持つディレクトリにファイルのリストを取得しようとしています。私は実行コードは以下の通りです: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; 

私はその後、私は検索したいフォルダの名前であることcodice_veicolo引数でマクロを実行すると、私は次のエラーを取得する:

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 

私はいくつかの理由でそれがマクロ変数を解決できませんでしたと仮定が、私は実行する場合:

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

私は適切なパスと適切なディレクトリを取得し、それゆえ私は、問題はトンであると仮定します彼はinfile声明。コードはマクロ変数を使用せずに正常に動作します。

私はWindows 9でSAS 9.4を使用しています。

は、事前にありがとう:) をルカ

答えて

1

マクロ変数の参照は、単一引用符の内側に展開されません。 代わりにこれを試してください。

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

ブリリアント!それは正常に動作します:D ありがとうございます! –