我在名为 taq 的库中有一堆以日期命名的数据集(例如 20130102)。通常,当我尝试读取多个数据集时,我会set taq.cq_&yyyymmdd:;
。这样,如果我输入 yyyymmdd 为 201201,它将获取以前缀 201201 开头的所有数据集。
但是,现在我正在尝试在所有数据集上运行宏循环。理想情况下:
%MACRO EXAMPLE(DATE_VAR);
DO WHILE(...);
%ANOTHER_MACRO(SOMETHING);
END;
%MEND;
如果我输入 %EXAMPLE(201301);
,它将调用另一个宏,该宏在以前缀 201301 开头的每个数据集上执行。
我想知道如何设计一个 do 循环来做到这一点?
我读过一些关于 SAS forum 的帖子和 StackOverflow 。但似乎他们要么在所有数据集上运行宏,要么需要手动输入我正在运行的数据集列表。我试图使该过程自动化(也就是说,该程序可以检测带有本身前缀的所有数据集。)
最佳答案
从元数据中读取数据集名称列表。您可以使用 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)
关于SAS 宏循环数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44265010/