2016-08-01 88 views
0

我使用在線發現的宏將多個excel文件導入到單個sas數據集中。它工作得很好。但我也想添加一個變量「板」來指定每個excel文件。下面是宏:在導入後但在追加之前添加變量

%macro MultImp(dir=,range=,out=,n=); 

%let rc=%str(%'dir %")&dir.%str(\%" /A-D/B/ON%'); 
filename myfiles pipe %unquote(&rc); 

data list; 
length fname $256.; 
infile myfiles truncover; 
input myfiles $100.; 

fname=quote(upcase(cats("&dir",'\',myfiles))); 
out="&out"; 
drop myfiles; 
call execute(' 
%do i=1 %to &n.; 
proc import dbms=xlsx out= _test 
     datafile= '||fname||' replace ; 

     range="&range"; 


run; 

data _test; 
set _test; 
plate=&i; 
run; 

proc append data=_test base='||out||' force; run; 
proc delete data=_test; run; 
%end; 
'); 
run; 
filename myfiles clear; 

%mend; 

%MultImp(dir=U:\test,range=summary$.D10:Y200,out=test,n=30); 

我寫了一個做循環的call execute裏面,proc import後運行一個小的數據的一步,但proc append之前。但它不起作用。任何人都可以有任何想法如何在追加數據集之前添加此變量。 非常感謝您提前。

回答

0

我覺得你只是工作太辛苦。先將這些命令建立到一個變量中,然後傳遞給CALL EXECUTE()

我想不通什麼N=參數正在做,所以我剛剛刪除它。

%macro MultImp(dir=,range=,out=); 
data list; 
    infile "dir ""&dir"" /A-D/B/ON" pipe truncover ; 
    input filename $255.; 
    out="&out"; 
    plate+1; 
    length fname $600 cmd $3000; 
    fname=quote(catx('\',"&dir",filename)); 
    cmd=catx(' ','proc import dbms=xlsx out=_test replace' 
       ,'datafile=',fname 
       ,'; range="&range"; run;' 
       ,'data _test; plate=',plate,'; set _test; run;' 
       ,'proc append data=_test base=&out force; run;' 
       ,'proc delete data=_test; run;' 
     ) 
    ; 
    call execute(trim(cmd)); 
run; 
%mend multimp; 

proc delete data=test; run; 
%MultImp(dir=U:\test,range=summary$.D10:Y200,out=test); 
+0

優秀!非常感謝你!!! – lxcfuji

0

什麼是管道(|)在你的proc append中做什麼?在執行此操作之前,最可能只需刪除基本數據,因爲您的代碼看起來基本正確。我只是不確定管道或應該做什麼?雙管通常意味着連接,即在你的調用中執行它們是有意義的。但不是在proc append中。

刪除了數據集的宏調用

proc delete data=out;run; 

之前修改進程內追加

proc append data=_test base=&out force; run;