SAS 宏循环数据集

标签 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 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/

相关文章:

r - 在 R 中创建类似 SAS 的库

sas - 如何在不安装 SAS 服务器的情况下使用 Talend 读取/写入 SAS 文件?

sas - 如何对 SAS 宏变量使用算术运算符

java - JAVA 的 SOAP 请求与 SAS 中的 PROC SOAP

sas - 对 sas 数据集进行子集化而不创建新的数据文件,而是创建新变量

sas - 有效地将SAS中的三次样条拟合到特定的对象网格

r - 谁能帮我写一个 R 数据框作为 SAS 数据集?

SAS:将当前文件夹设置为包含正在运行的程序的文件夹

loops - 做不等增量循环

SAS:显示下推到数据库的 SQL