在导入之后但在追加之前添加变量
add variable after importing but before append
我正在使用在线找到的宏将多个 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 6.;
infile myfiles truncover;
input myfiles 0.;
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
之前写了一个小数据步骤。但它不起作用。任何人都知道如何在附加数据集之前添加此变量。
非常感谢您。
你的 proc append 中的竖线 (|) 是做什么用的?很可能您只需要在执行此操作之前删除基础数据,因为您的代码看起来大部分都是正确的。我只是不确定管道是做什么用的或应该做什么?双管道通常意味着串联,即在您的调用中执行它们是有意义的。但不在 proc append.
宏调用前删除数据集
proc delete data=out;run;
修改proc追加
proc append data=_test base=&out force; run;
我觉得你太努力了。先将命令构建到一个变量中,然后将其传递给 CALL EXECUTE()
。
我不知道 N=
参数在做什么,所以我把它删除了。
%macro MultImp(dir=,range=,out=);
data list;
infile "dir ""&dir"" /A-D/B/ON" pipe truncover ;
input filename 5.;
out="&out";
plate+1;
length fname 0 cmd 00;
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);
我正在使用在线找到的宏将多个 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 6.;
infile myfiles truncover;
input myfiles 0.;
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
之前写了一个小数据步骤。但它不起作用。任何人都知道如何在附加数据集之前添加此变量。
非常感谢您。
你的 proc append 中的竖线 (|) 是做什么用的?很可能您只需要在执行此操作之前删除基础数据,因为您的代码看起来大部分都是正确的。我只是不确定管道是做什么用的或应该做什么?双管道通常意味着串联,即在您的调用中执行它们是有意义的。但不在 proc append.
宏调用前删除数据集
proc delete data=out;run;
修改proc追加
proc append data=_test base=&out force; run;
我觉得你太努力了。先将命令构建到一个变量中,然后将其传递给 CALL EXECUTE()
。
我不知道 N=
参数在做什么,所以我把它删除了。
%macro MultImp(dir=,range=,out=);
data list;
infile "dir ""&dir"" /A-D/B/ON" pipe truncover ;
input filename 5.;
out="&out";
plate+1;
length fname 0 cmd 00;
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);