宏以调用数据集并将其连接

时间:2019-05-20 12:54:02

标签: macros sas concatenation

我知道如何从文件夹中调用不同的表。这是通过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 个答案:

答案 0 :(得分:5)

我会避免将数据从数据集中移到宏变量中。

首先要尝试的是根本不使用宏编码。尝试仅使用数据集列表。如果您可以找到所需数据集的一个或多个常用前缀。

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;

但是,如果您确实有1,000个数据集,那么将其放入单个宏变量(限制为65K个字符)中可能太多了。

您还可以仅从数据生成代码,而不使用宏来生成代码。这样就无需将任何数据移动到宏变量中。例如,您可以使用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;