假设我有以下来自调用proc内容的输出:
Name Type Format
x 1 DATETIME
y 2 $
根据我想调用不同宏的格式。让我们说我有两个宏,%date(var =)和%rest(var =)。最后,我想调用名称为x的宏%日期和名称为y的宏%。我希望它或多或少地清楚我想要做什么。谢谢!
答案 0 :(得分:1)
是的,这是可能的,但您不是试图处理PROC CONTENTS
,而是通常从PROC CONTENTS
请求输出数据集,然后进一步处理:
proc contents data=mydata out=mycontents noprint;
run;
NOPRINT
选项会抑制正常的打印输出。 MYCONTENTS
数据集将包含MYDATA
数据集中每个变量的行,其中包含type
,length
,format
等列。您可以根据您的意愿进一步处理您的%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;
这使用两个小宏来封装每种数据类型所需的不同代码,但请注意,这并不是在数据集中每个记录调用一次宏 - 每次数据时都会调用一次宏正在解析/编译步骤,然后在输入数据集中的每个记录执行一次生成宏的代码。
有一种方法可以在输入数据集中为每个记录调用一次宏,但只有在非常特殊的情况下才需要这种方法。如果您想对数据集中已有的数据进行一些按记录处理,那么如果可能的话,您几乎应该始终使用数据步骤。