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