在导入之后但在追加之前添加变量

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);