【发布时间】:2017-02-02 10:47:01
【问题描述】:
假设,我通过调用 proc 内容得到以下输出:
Name Type Format
x 1 DATETIME
y 2 $
根据我想调用不同宏的格式。假设我有两个宏,%date(var = ) 和 %rest(var = )。最后,我想用名称 x 调用宏 %date,用名称 y 调用宏 %rest。我希望或多或少清楚我要做什么。谢谢!
【问题讨论】:
假设,我通过调用 proc 内容得到以下输出:
Name Type Format
x 1 DATETIME
y 2 $
根据我想调用不同宏的格式。假设我有两个宏,%date(var = ) 和 %rest(var = )。最后,我想用名称 x 调用宏 %date,用名称 y 调用宏 %rest。我希望或多或少清楚我要做什么。谢谢!
【问题讨论】:
是的,这是可能的,但您通常不会尝试处理来自 PROC CONTENTS 的输出数据集,而是从 PROC CONTENTS 请求输出数据集,然后进一步处理:
proc contents data=mydata out=mycontents noprint;
run;
NOPRINT 选项禁止正常打印输出。 MYCONTENTS 数据集将包含 MYDATA 数据集中的每个变量的一行,以及 type、length、format 等列。然后您可以根据需要进一步处理,调用您的 @ 987654330@ 宏或其他。
编辑:
这是一个更完整的程序,展示了如何将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;
这使用两个小宏来封装每种数据类型所需的不同代码,但请注意,这并不是在数据集中的每条记录中调用一次宏 - 当数据步骤为被解析/编译,然后宏生成的代码在输入数据集中的每条记录中执行一次。
有一些方法可以让输入数据集中的每条记录调用一次宏,但只有在非常特殊的情况下才需要这种方法。如果您想对数据集中已经存在的数据进行一些每条记录的处理,您应该尽可能地使用数据步骤来完成。
【讨论】: