【问题标题】:add variable after importing but before append在导入之后添加变量,但在追加之前
【发布时间】:2016-12-07 04:15:53
【问题描述】:

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

【问题讨论】:

    标签: excel import sas proc


    【解决方案1】:

    你的 proc append 中的管道(|)在做什么?很可能您只需要在执行此操作之前删除基本数据,因为您的代码看起来基本正确。我只是不确定管道的用途或应该做什么?双管道通常意味着连接,即在您的调用中执行它们是有意义的。但不是在 proc append 中。

    在宏调用之前删除数据集

    proc delete data=out;run;
    

    修改过程附加

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

    【讨论】:

      【解决方案2】:

      我认为你工作太努力了。首先将命令构建成一个变量,然后将其传递给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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-27
        • 1970-01-01
        • 2015-07-16
        • 1970-01-01
        • 2016-01-28
        • 2016-01-22
        • 1970-01-01
        • 2016-05-03
        相关资源
        最近更新 更多