добавить переменную после импорта, но перед добавлением

Я использую макрос, найденный в Интернете, для импорта нескольких файлов 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);

Я написал цикл do внутри call execute и запустил небольшой шаг данных после proc import, но перед proc append. но это не работает. Может ли кто-нибудь понять, как добавить эту переменную перед добавлением наборов данных. Заранее большое спасибо.


person lxcfuji    schedule 01.08.2016    source источник


Ответы (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);
person Tom    schedule 02.08.2016

Что делают каналы (|) в вашем добавлении процедуры? Скорее всего, вам нужно просто удалить базовые данные перед этим, так как ваш код выглядит в основном правильно. Я просто не уверен, что трубы для или должны делать? Двойные каналы обычно означают конкатенацию, т.е. в вашем вызове execute они имеют смысл. Но не в proc append.

Удалить набор данных перед вызовом макроса

proc delete data=out;run;

Изменить процедуру добавления

proc append data=_test base=&out force; run;
person Reeza    schedule 02.08.2016