Макрос для вызова наборов данных и объединения его - PullRequest
2 голосов
/ 20 мая 2019

Я знаю, как вызывать разные таблицы из моей папки. Это делается с помощью function : %let x1 = libname.foldername. Моя проблема в том, как сделать это на 1000 таблиц с помощью простого макроса

SAS

%Let Table1=project.table_201710; 
%Let Table2=project.table_201711;
%Let Table3=project.table_201712;
%Let Table4=project.table_201801;
%Let Table5=project.table_201802; 
%Let Table6=project.table_201803;
%Let Table7=project.table_201804;
%Let Table8=project.table_201805;
%Let Table9=project.table_201806;
%Let Table10=project.table_201807;
%Let Table11=project.table_201808;
%Let Table12=project.table_201809;

%Macro ConcatTable;
Data project.TABLE_FINALE; 
Set
%Do i=1 %To 12;
&&Table&i. 
%End;
;
Run;
%Mend ConcatTable;
%ConcatTable

1 Ответ

5 голосов
/ 20 мая 2019

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

Первое, что нужно попробовать, это вообще не использовать макрокодирование.Попробуйте просто использовать списки наборов данных.Если вы можете найти один или несколько общих префиксов для нужных наборов данных.

data project.TABLE_FINALE; 
  set project.TABLE_20: ;
run;

Если вы действительно хотите поместить список в макропеременные, то это концептуально более понятно, и кодирование будет проще, если вы просто поместитесписок в одну макропеременную.

proc sql noprint;
  select dsname into :dslist separated by ' '
  from mylist;
quit;

data project.TABLE_FINALE; 
  set &dslist;
run;

Но если у вас действительно есть 1000 наборов данных, это может быть слишком много для помещения в одну макропеременную (ограничение 65 КБ символов).

Вы также можете просто сгенерировать код изданные вместо использования макроса для генерации кода.Тогда нет необходимости перемещать какие-либо данные в макропеременные.Например, вы можете использовать CALL EXECUTE().

data _null_;
  set mylist end=eof;
  if _n_=1 then call execute('data project.TABLE_FINALE; set');
  call execute(' '||trim(dsname));
  if eof then call execute(';run;');
run;
...