2017-05-30 114 views
1

我有一堆數據集以名爲日期(例如,20130102)命名爲taq的庫中。通常當我嘗試讀取多個數據集時,我會做set taq.cq_&yyyymmdd:;。因此,如果我輸入yyyymmdd爲201201,它將獲取以201201開頭的所有數據集。SAS宏以循環訪問數據集

但是,現在我試圖在所有數據集上運行宏循環。理想的情況是:

%MACRO EXAMPLE(DATE_VAR); 
    DO WHILE(...); 
     %ANOTHER_MACRO(SOMETHING); 
    END; 
%MEND; 

如果我輸入%EXAMPLE(201301);,它會調用另一個宏,其執行上的每個數據集開始前綴201301.

我想知道如何設計一個做循環來做到這一點?

我已閱讀SAS forumStackOverflow的一些帖子。但似乎他們要麼在所有數據集上運行宏,要麼他們需要手動輸入我正在運行的數據集列表。我試圖讓程序自動執行(也就是說,程序可以使用前綴本身檢測所有數據集。)

+0

的SAS教程最好的參考,如何是要麼lexjansen.com這是用戶所撰寫的文章會回來,所以存在,同樣與社區.sas.com。而且,UCLA SAS教程也很棒,雖然有點過時。 – Reeza

回答

2

從元數據中讀取數據集名稱列表。您可以使用DICTIONARY.MEMBERS(也可用作SASHELP.VMEMBER)。或者您可以使用PROC CONTENTS生成列表。

例如,您可能有一個參數來提供指向數據集的libref和用於幫助選擇特定成員的參數。一旦你有了列表,然後生成宏調用。例如,您可以使用CALL EXECUTE()來生成宏調用。

%macro example(libref,prefix); 
    proc contents data=&libref.._all_ noprint out=contents; run; 
    data _null_; 
    set contents; 
    by memname; 
    if first.memname ; 
    if upcase(memname) =: %upcase("&prefix"); 
    call execute(cats('%nrstr(%another_macro)(',memname,')')); 
    run; 
%mend; 

然後您例如電話是:

%example(taq,cq_201301) 
+0

我試圖讓%another_macro使用下面的代碼創建memname:proc print data = memname;但它似乎需要永遠運行,無法打印任何東西。這很奇怪...... –

+0

MPRINT選項對調試宏調用很有用,因爲它將打印宏生成的生成的SAS代碼。你可以調用'%another_macro()'宏並讓它工作嗎?你可以用一個數據集的確切名稱調用'%example()'宏並查看它是否有效? – Tom

+0

因爲它是一個字符串,我應該做%例子('taq,cq_201301')嗎? –