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

Macros 是否可以循环proc内容并为每个条目生成一个表?,macros,sas,Macros,Sas,假设调用proc contents得到以下输出: Name Type Format x 1 DATETIME y 2 $ 根据我想调用不同宏的格式。假设我有两个宏,%datevar=和%restvar=。最后,我想调用名为x的宏%date和名为y的宏%rest。我希望我想做的事情或多或少是清楚的。谢谢大家! 是的,这是可能的,但与尝试处理进程外内容不同,您通常会从进程内容请求输出数据集,然后进一步处理: proc contents data=mydata

假设调用proc contents得到以下输出:

Name Type Format
  x    1    DATETIME
  y    2        $

根据我想调用不同宏的格式。假设我有两个宏,%datevar=和%restvar=。最后,我想调用名为x的宏%date和名为y的宏%rest。我希望我想做的事情或多或少是清楚的。谢谢大家!

是的,这是可能的,但与尝试处理进程外内容不同,您通常会从进程内容请求输出数据集,然后进一步处理:

proc contents data=mydata out=mycontents noprint;
run;
NOPRINT选项禁止正常打印输出。MyContent数据集将包含MYDATA数据集中每个变量的一行,其中包含类型、长度、格式等列。然后,您可以调用%date宏或其他任何方式进一步处理该行

编辑:

下面是一个更完整的程序,展示了如何将结果变量添加到内容数据集中,为每种数据类型使用单独的宏。注意,在这段代码中没有特别需要使用宏

%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;
这使用两个小宏来封装每种数据类型所需的不同代码,但请注意,这并不是在数据集中每个记录调用一次宏-在解析/编译数据步骤时,每个宏只调用一次,然后,宏生成的代码在输入数据集中的每个记录执行一次


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

谢谢您的回答。你能说得更具体些吗?你会如何使用mycontent?我不确定在什么环境下可以根据类型调用宏。谢谢有很多方法可以剥猫的皮,但有些方法像“数据无效;设置内容;如果format='date',则调用execute'%datevar='| | | | |';运行;',例如您可以查找调用执行的文档。它也可以通过更纯粹的宏观方式完成,具体取决于口味。您是要为每个变量生成一个调用,还是只为所有日期变量生成一个对%date的调用,为所有非日期变量生成一个对%rest的调用?首先,我想在proc内容的输出中添加一个列结果。根据名称,通过调用两个宏中的一个来设置列结果的值。你会怎么做?我非常感谢你的帮助!我已经编辑了我的答案,以进一步扩展示例代码。不过,现在这已成为一个范围非常广泛的问题!@克里斯·朗。这很好用。非常感谢您抽出时间回答我的问题。