是否可以循环proc内容并为每个条目生成一个表?

时间:2017-02-02 10:47:01

标签: macros sas

假设我有以下来自调用proc内容的输出:

Name Type Format
  x    1    DATETIME
  y    2        $

根据我想调用不同宏的格式。让我们说我有两个宏,%date(var =)和%rest(var =)。最后,我想调用名称为x的宏%日期和名称为y的宏%。我希望它或多或少地清楚我想要做什么。谢谢!

1 个答案:

答案 0 :(得分:1)

是的,这是可能的,但您不是试图处理PROC CONTENTS,而是通常从PROC CONTENTS请求输出数据集,然后进一步处理:

proc contents data=mydata out=mycontents noprint;
run;

NOPRINT选项会抑制正常的打印输出。 MYCONTENTS数据集将包含MYDATA数据集中每个变量的行,其中包含typelengthformat等列。您可以根据您的意愿进一步处理您的%date()宏或其他任何内容。

编辑:

这是一个更完整的程序,显示如何使用单独的宏为每种数据类型向内容数据集添加result变量。请注意,此代码中没有特别需要使用宏。

%macro num_macro();
    result = 'I''m a numeric';
%mend;

%macro char_macro();
    result = 'I''m a character';
%mend;

data in;
  attrib datevar length=8 format=date9.;
  attrib charvar length=$ 20;
  attrib numvar length=8;
run;

proc contents data=in out=contents noprint;
run;

data contents_with_result;
  length result $ 40;
  set contents (keep = name type);
  if type=1 then do;
    %num_macro();
  end;
  else do;
    %char_macro();
  end;
run;

proc print;
run;

这使用两个小宏来封装每种数据类型所需的不同代码,但请注意,这并不是在数据集中每个记录调用一次宏 - 每次数据时都会调用一次宏正在解析/编译步骤,然后在输入数据集中的每个记录执行一次生成宏的代码。

有一种方法可以在输入数据集中为每个记录调用一次宏,但只有在非常特殊的情况下才需要这种方法。如果您想对数据集中已有的数据进行一些按记录处理,那么如果可能的话,您几乎应该始终使用数据步骤。