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

时间:2016-08-01 23:51:32

标签: excel import sas proc

我使用在线发现的宏将多个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之前运行一个小数据步骤。但它不起作用。任何人都可以知道如何在附加数据集之前添加此变量。 非常感谢你提前。

2 个答案:

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