循环使用ODS Excel输出SAS比对结果仅保留最后数据集的问题
问题原因&解决方案
哈哈,这个问题我太熟了!你遇到的是SAS ODS输出里一个超常见的小坑——把ODS Excel的打开和关闭语句放到循环内部了。
为啥会只出最后一个结果?
每次循环执行ods excel file="D:\test.xlsx";的时候,SAS都会重新创建这个Excel文件,直接覆盖掉上一次循环生成的内容。循环跑了N次,就相当于被覆盖了N-1次,最后自然就只剩最后一次循环的比对结果啦。
修正后的代码
把ODS Excel的打开/关闭移到循环外面,让整个循环过程中文件保持打开状态,所有PROC COMPARE的结果就会依次追加到同一个Excel文件里(默认每个PROC会生成一个独立工作表):
/* 先打开ODS Excel输出,放在循环外部 */ ods excel file="D:\test.xlsx" options(sheet_name="&DT._Compare"); /* 可选:自定义工作表名称,方便区分不同数据集的比对结果 */ %DO I = 1 %TO &coun; %LET DT = %SCAN (&DS_LIST., &I., ~); PROC COMPARE BASE = BASE.&DT. COMPARE = COMPARE.&DT. OUTNOEQUAL OUTBASE OUTCOMP OUT = COMPAREOUT; RUN ; %END; /* 所有循环执行完后,再关闭ODS Excel */ ods excel close;
额外小技巧
- 如果你希望每个工作表的名字更直观,
options(sheet_name="&DT._Compare")会让每个工作表以「数据集名_Compare」命名,找结果的时候一目了然; - 如果想把所有比对结果放到同一个工作表里,可以加上
options(embedded_titles='yes' start_at='A1')这类参数,不过默认的多工作表模式其实更便于区分不同数据集的结果。
内容的提问来源于stack exchange,提问作者user3658367
相关产品推荐
相关产品推荐

