我在一个名为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上的一些帖子。但似乎他们要么在所有数据集上运行宏,要么他们需要手动输入我正在运行的数据集列表。我试图让程序自动化(也就是说,程序可以检测所有带有前缀的数据集。)
答案 0 :(得分:2)
从元数据中读取数据集名称列表。您可以使用DICTIONARY.MEMBERS(也可用作SASHELP.VMEMBER)。或者你可以使用PROC CONTENTS来生成列表。
例如,您可能有一个参数来提供指向数据集的libref,以及用于帮助选择特定成员的其他参数。获得列表后,生成宏调用。例如,您可以使用CALL EXECUTE()来生成宏调用。
<br>
然后,对于您的示例,调用将是:
%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;