如何使用宏变量按类别将SAS数据集导出到XLSX?

时间:2014-10-10 14:55:31

标签: excel sas sas-macro

我有一个大型数据集,大约有100个管理员名称。现在,我需要按管理器名称导出数据,以便每个管理器都有一个数据集。我可以使用宏为每个管理器(本质上是一个类别)创建一个单独的数据集,使用代码:

%macro break(byval);                                                                                                                                  
   data &byval;                                                             
      set final(where=(Project_Manager_Name="&byval"));                              
   run;                                                                                                                                                 
%mend;                                                                      

data _null_;                                                                
  set final;                                                               
  by Project_Manager_Name;                                                                  
  if first.Project_Manager_Name then 
    call execute(%nrstr('%break('||trim(Project_Manager_Name)||')'));            
 run;

这是我被卡住的地方。我只需要每个文件的.xlsx文件,并在每个文件名的末尾包含管理器的名称,如:

proc export
    data = final
    dbms = xlsx
    outfile = "&OUTPUT.\Final_Report_ManagerName.xlsx"
    replace;
run;

我假设我将&byval宏变量放在outfile名称的某处,但是我仍然得到错误,因为它没有被引用。有什么见解吗?

1 个答案:

答案 0 :(得分:0)

要使用PROC EXPORT,您必须编写宏并调用PROC EXPORT 100次。这不是一个很棒的方法。您也可以使用LIBNAME执行相同的操作,但不是100个导出调用,而是在数据步骤中有100个数据集名称,100个选择/何时/输出条件块,用于标识每个管理器的数据。< / p>

更好的方式:

  • 如果您有9.4M1,则可以使用ODS EXCEL执行此操作。查找ODS EXCEL,然后使用sheet_label选项为每个组创建一个新工作表,以从变量中定义工作表名称。此选项与ODS TAGSETS.EXCELXP相同(与大多数ODS EXCEL一样)。
  • 如果你不这样做,你可以使用散列对象输出方法来更有效地执行此操作,但仍然不是理想的 - 至少它不需要大量的宏编程。

在一天结束时,创建一个导出宏并调用它类似于你如何调用%break宏(或者,更有可能的是,在%break宏中设置导出代码)对你来说可能是最简单的事情。尽管它不是很理想(你正在做的事情的运行时间很长)。

proc export
    data = &byval.
    dbms = xlsx
    outfile = "&OUTPUT.\Final_Report_&byval..xlsx"
    replace;
run;

需要进入%break宏才能执行此操作。您还可以跳过byval中的数据步骤,只需将WHERE添加到导出data=final(where=(Project_Manager_Name="&byval"))