2014-10-10 93 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