SAS编程:怎样将数据集批量输出到Excel?

分享
开发者 2024-9-21 00:38:31 66 0 来自 中国
偶尔为相识项目数据结构,须要检察不少原始数据。简单的记载筛选,SAS操纵起来不复杂,但是对于大批量数据记载的检察,SAS筛选就显得繁琐。这种环境下,将数据集批量输出到Excel中举行检察,不失为一个很好的方法。
数据集批量输出的要达到什么效果呢?出于筛选方便的思量,全部数据集生存在一个Excel文件中,数据集名称作为对应的Sheet名称,每个表单冻结首行,而且直接设置首行筛选
这样打开Excel文件,就可以不须要额外设置,可以直接欣赏、筛选数据。
在SAS编程中,常见的批量处置惩罚的方法有两种,一是宏步调中的宏循环,二是call execute语句
下面先容整个输出的实现过程,先从单个数据集输出开始。
1. 单个数据集的输出

SAS步调参考之前的文章SAS编程:输出SAS数据集(Listing)到EXCEL。通常,使用export过程步,举行简单的输出;使用ods excel语句以及report过程步,举行复杂的输出设置,比方,冻结标题、首行主动筛选等
ods excel file = "E:\999_test.xlsx"      options(sheet_name="Class"  frozen_headers="Yes" autofilter = "Yes");proc report data = sashelp.class; column _all_;run;ods excel close;输出效果如下:
单个数据集实现了对应格式的输出。
2. 两个数据集的输出

照旧参考之前的文章,第二个ods excel语句输出不添加file=语句,这样两个数据集就输出到同一个Excel文件的差别sheet中。
ods excel file = "E:\999_test\test.xlsx"      options(sheet_name="Class"  frozen_headers="Yes" autofilter = "Yes");proc report data = sashelp.class;run;ods excel      options(sheet_name="Cars" frozen_headers = "Yes" autofilter="Yes");proc report data = sashelp.cars; column _all_;run;ods excel close;3个及以上数据集的输出,与此类似。
3. 逻辑库内全部数据集的输出

显然,如果照着上面举例手动添加数据集的输出步调,输出逻辑库中的全部数据集的过程就太过繁琐,以是须要批量处置惩罚。
常见的批量处置惩罚的方法有两种,一是宏循环,二是call execute语句。下面来先容这两种方法的实现。
不管哪种方法,起首须要获取逻辑库中的数据集名称,以方便引用。这里,以SASHelp逻辑库中前10个数据集举行举例。
**Get datasets' names;data tables;  set sashelp.vtable;  where libname = "SASHELP";  if _n_ <= 10;  keep libname memname;run;输出效果如下:
3.1 宏循环批量输出数据集

SAS宏可以明白成是“代码天生器”,宏步调的批量处置惩罚是通过宏循环实现
参考两个数据集输出的代码,对于差别数据集,sheet_name=与data=选项值是厘革的。思量到SAS数据集名称是不区分巨细写,这两个选项值可以看作是相同的。
宏循环的思绪是,将数据集的名称生存到各个宏变量中,这些宏变量名称的前缀相同,后缀以序号末端。这里我将其称为,宏变量序列。获取宏变量序列后,使用循环变量,从而实现“代码天生”的效果。
3.1.1 宏变量序列的天生

宏变量序列的天生常用也有2种方法:

  • Proc SQL 中的into :语句
  • Data步中的call symputx语句
3.1.1.1 Proc SQL天生宏变量序列

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.; 5.png 输出效果与SQL效果同等,可以看出Data步方法实现可以省去获取数据集记载数的步调,团体上代码比力轻便
3.1.2 宏循环批量输出数据集

宏循环须要处置惩罚,第一个数据集与其他数据集输出的差别(后续数据集不须要file=选项),用判定语句举行区分。
如果想要检察宏步调详细的运行代码,可以参考文章SAS编程:查抄宏步调issue思绪先容,内里有对mprint选项的先容。
调试步调的时间,发现SASHelp.BIRTHWGT这个数据集居然有10万条记载,ods excel语句输出会出现内存不敷等题目,于是使用ods tagsets.excelxp举行输出
**Export datasets to Excel file using macro loop;%macro loop; %do a = 1 %to 10;  %if &a. = 1 %then %do;    ods tagsets.excelxp file = "E:\999_test\test.xlsx"       options(sheet_name="&name1."  frozen_headers="Yes" autofilter = "Yes");    proc report data = sashelp.&name1.;     column _all_;    run;  %end;    %else %do;    ods tagsets.excelxp options(sheet_name="&&name&a." frozen_headers = "Yes" autofilter="Yes");    proc report data = sashelp.&&name&a.;     column _all_;    run;  %end;%end;ods tagsets.excelxp close;%mend;%loop;题目处置惩罚

但使用ods tagsets.excelxp有会出现一个题目,输出文件用Excel打开的话,会显示如下内容,无法打开文件:
WPS可以正常打开输出文件,10个数据集完备的输出到Excel文件中。
也可以使用.xls作为输出文件的后缀,这时文件可以用Excel打开,不外会有Warning提示。
ods tagsets.excelxp file = "E:\999_test\test.xls" ods tagsets.excelxp close;尚有一个退而求其次的方法,舍弃Excel的设置,使用export过程步,举行简单的输出,不举行Excel的属性设置,后续再使用VBA对各个Sheet举行批量属性设置。
%macro loop;  %do a = 1 %to 10;    proc export data=sashelp.&&name&a.        outfile='E:\999_test\test.xlsx'        dbms=xlsx replace;        sheet = "&&name&a.";    run;  %end;%mend;%loop;3.2  call execute()批量输出数据集

3.2.1 call execute()的简单先容

官方文档是这样,先容call execute()语句的:
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同等:
总结

文章先容了2种将数据集批量输出到Excel中的方法,宏循环和call execute()语句。宏循环,是先将全部数据集名称生存到宏变量序列中,然后通过宏循环举行调用。call execute()语句,是通过获取数据集变量值构建完备的运行步调。
本质上,宏循环和call execute()语句作用是相同的,都是“代码天生器”。
在先容宏循环实现的过程中,还先容了2种天生宏变量序列的方法。
感谢阅读, 接待关注:SAS茶谈!
如有疑问,接待品评互换!
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-19 02:25, Processed in 0.146299 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表