【问题标题】:How to export SAS dataset to XLSX, by category, using macro variable?如何使用宏变量按类别将 SAS 数据集导出到 XLSX?
【发布时间】:2023-03-25 11:21:01
【问题描述】:

我有一个包含大约 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 宏变量放在了输出文件名的某个位置,但我仍然收到错误,表明它没有被引用。有什么见解吗?

【问题讨论】:

  • 将您的 proc 导出移动到您的中断宏中,用 outfile 中的经理名称替换所有。

标签: excel sas sas-macro


【解决方案1】:

要使用 PROC EXPORT,您必须编写一个宏并调用 PROC EXPORT 100 次。这不是一个绝妙的方法。您也可以使用 LIBNAME 来做同样的事情,但不是 100 个导出调用,而是您的数据步骤中有 100 个数据集名称和 100 个选择/何时/输出条件块,用于标识如何处理每个经理的数据。

更好的方法:

  • 如果您有 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"))

【讨论】:

  • 谢谢,乔!就在我检查您的评论之前,它就在我检查您的评论之前——在 &byval 之后的第二个时期第一次得到了我,所以我所有的名字最初都有 xlsx。好东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-23
  • 1970-01-01
  • 2012-11-15
  • 1970-01-01
相关资源
最近更新 更多