2014-10-10 89 views
0

我有一个拥有大约100个经理名字的大型数据集。现在,我需要通过经理名称导出数据,以便为每位经理提供一个数据集。我可以使用宏来创建一个单独的数据集使用的代码每位经理(实际上是一个类):如何使用宏变量按类别将SAS数据集导出到XLSX?

%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

将您的proc导出到您的break宏中,用outfile中的所有经理名称替换它。 – Reeza 2014-10-10 17:12:41

回答

0

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

更好的方法:

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

在一天结束的时候,创造了出口宏,把它类似于你如何调用%的断裂宏(或者,更可能的是,设置%的断裂宏内部的出口代号)可能是最容易的事对于你来说,即使它不是很理想(你正在做什么的时间很长)。

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

这需要进入%break宏来做到这一点。您也可以跳过byval中的数据步骤,只需将WHERE添加到导出文件data=final(where=(Project_Manager_Name="&byval"))即可。

+0

谢谢,乔!如果在检查您的评论之前就已经发生了这种情况 - 在&byval之后的第二段时间首次让我获得了我的名字,所以我的名字一开始都有xlsx。好东西。 – Foxer 2014-10-10 19:26:52