into :语句之前先容过,可以参考SAS编程:Proc SQL天生宏变量时INTO子句的使用 。使用这个方法,须要获取数据集的记载数,这里就不先容怎样获取数据集的记载数了,直接办动赋值为10。
**Save tables' names in macro vars by sql;proc sql noprint; select memname into :memname1- :memname10 from tables;quit;%put memname1 = &memname1.;%put memname10 = &memname10.;输出效果如下:
3.1.1.2 Data 步中天生宏变量序列
与SQL中依赖后缀序列举行计数差别,Data步中数据集自带的主动变量_n_可以实现计数的功能。
**Save tables' names in macro vars by data step;data _null_; set tables; call symputx("name"||strip(put(_n_, best.)), strip(memname));run;%put memname1 = &name1.;%put memname10 = &name10.;
输出效果与SQL效果同等,可以看出Data步方法实现可以省去获取数据集记载数的步调,团体上代码比力轻便。
3.1.2 宏循环批量输出数据集
Resolves the argument, and issues the resolved valuefor execution at the next step boundary.
(分析参数,并发出已分析的值以便在下一步界限实行。)
call execute()是为了在Data步中实行其他完备的SAS代码,括号内里的内容是一段完备的字符串,举个简单的例子。
data _null_; call execute( ' data class; set sashelp.class; run; ' );run;以上的代码就是直接引号中的步调。这里读者大概会有疑问,直接写一遍引号中的代码再运行,不是更方便吗?
单从直接调用简单的SAS步调来讲,这确实是多此一举。但是,call execute()是可以直接调用数据会合的记载值,举行运行。再举个例子:
data tmp; a = "class";run;data _null_; set tmp; call execute( ' data class; set sashelp.'||strip(a)||'; run; ' );run;以上步调运行的效果,是分析数据集Tmp中变量a的值,带入引号中的步调。可以这样明白,括号中的内容仍旧是一个待运行的字符串,只不外这个字符串拼接了Tmp数据会合变量a的值。
读者看到这里大概又会有疑问,如果数据会合有多条数据,call execute()将如那里理呢? 如果数据会合有多条数据,call execute()就会运行多次步调,按数据集记载的行数举行迭代,每一次运行的步调会更新"变量a"的值。
如果Tmp数据会合有2条记载,class, cars,那么末了实行的代码如下:
data class; set sashelp.class; run; data class; set sashelp.cars; run;3.2.2 call execute()批量输出数据集到EXCEL
有了上面的先容,直接看批量输出数据集的代码:
data _null_; set tables end = eof; if _n_ = 1 then call execute( ' ods tagsets.excelxp file = "E:\999_test\test.xlsx" options(sheet_name="'||strip(memname)||'" frozen_headers="Yes" autofilter = "Yes"); proc report data = sashelp.'||strip(memname)||'; column _all_; run; ' ); else call execute( ' ods tagsets.excelxp options(sheet_name="'||strip(memname)||'" frozen_headers="Yes" autofilter = "Yes"); proc report data = sashelp.'||strip(memname)||'; column _all_; run; ' ); if eof then call execute( ' ods tagsets.excelxp close; ' );run;步调中,通过_n_这个主动变量举行区分是否是第一条记载,然后举行对应的设置;end = eof选项,新建eof变量用于判定记载是否到达尾行,尾行须要将输出举行关闭。
输出效果与前面SQL同等:
总结