SAS宏循环数据集

时间:2017-05-30 14:27:39

标签: sas

我在一个名为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 forumStackOverflow上的一些帖子。但似乎他们要么在所有数据集上运行宏,要么他们需要手动输入我正在运行的数据集列表。我试图让程序自动化(也就是说,程序可以检测所有带有前缀的数据集。)

1 个答案:

答案 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;