我使用在线发现的宏将多个Excel文件导入单个sas数据集。而且效果很好。但我也想添加一个变量" plate"指定每个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
内写了一个do循环,并在proc import
之后但在proc append
之前运行一个小数据步骤。但它不起作用。任何人都可以知道如何在附加数据集之前添加此变量。
非常感谢你提前。
答案 0 :(得分:0)
你的proc追加中有哪些管道(|)?在执行此操作之前,您很可能只需删除基础数据,因为您的代码看起来大致正确。我只是不确定管道是用于或应该做什么的?双管通常意味着连接,即在你的调用中执行它们是有意义的。但不是在proc附加。
在宏调用之前删除数据集
proc delete data=out;run;
修改proc append
proc append data=_test base=&out force; run;
答案 1 :(得分: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);