sas格式并不总是由宏创建失败语法检查

时间:2016-04-22 20:24:08

标签: format sas sas-macro

我有一个sas宏,如果满足某些条件,则创建一个用户定义的格式,稍后在宏中使用。但是,并不总是创建此用户格式。因此,当sas在调用宏时验证语法时,如果不满足条件,则不知道用户定义格式的错误。使用用户定义格式的语句包含在if条件中,该条件尚未满足,但宏仍然存在错误。

任何克服这个问题的建议都很受欢迎。

2 个答案:

答案 0 :(得分:1)

处理这个问题的一个好方法是在条件创建之前创建一个实际上没有做任何事情的虚拟格式。这样,您就可以防止错误。

%macro fizz_buzz(format=0);
*Format that does nothing;
proc format;
  value FIZZBUZZF
  other=[best.]
  ;
quit;

*Conditionally created same format;
%if &format=1 %then %do;
  proc format;
    value FIZZBUZZF
      3,6,9,12='FIZZ'
      5,10='BUZZ'
      15='FIZZBUZZ'
      other=[2.]
    ;
  quit;
%end;

data _null_;
  do _i = 1 to 15;
    put _i fizzbuzzf.;
  end;
run;
%mend fizz_buzz;

%fizz_buzz(format=0);

答案 1 :(得分:1)

IF条件是什么意思? SAS将在开始执行之前检查DATA步骤的语法。因此,无法通过使用IF或类似的执行时间代码来阻止数据步骤中的格式引用。因此,即使IF语句中的条件永远不会为真,此代码也会生成错误。

data bad;
  if 0=1 then format x $1XYZ.;
run;

如果您使用宏%IF语句,以便在宏创建的SAS代码中永远不会生成对格式的引用,那么您不应该有任何错误。因此,如果您有一个宏生成类似的数据步骤,并使用%IF来阻止宏生成无效的格式名称,那么代码将运行而不会出错。

data good;
%if (0=1) %then %do;
  format x $1XYZ.;
%end;
run;

您很可能只想使用宏变量来保存格式名称,如果未创建格式,则将其设置为空。

data good;
   format x &format_name ;
run;