SAS将代码包含在数据步骤中

时间:2017-11-09 11:32:19

标签: sas include datastep

我已动态创建一个myfile.sas,内容如下:

and a = 0
and b = 0

现在我想将此文件包含在数据步骤中:

data y;
   set x;

   if 1=1 
      %include incl("myfile.sas")
   then selektion=0;
   else selektion=1;
run;

结果应为:

data y;
   set x;

   if 1=1 
      and a=0
      and b=0
   then myvar=0
   else myvar=1;
run;

但是我收到以下错误:

ERROR 388-185: Expecting an arithmetic operator.
ERROR 200-322: The symbol is not recognized and will be ignored.

是否可以将文件包含在if语句中?

3 个答案:

答案 0 :(得分:3)

确实,这不起作用。您可以在%includedata步骤中使用proc向其添加一些行,但不在不完整的声明中。

你的myfile.sas看起来像这样:

if 1=1
and a = 0
and b = 0
你可以写

data y;
   set x;
   %include "myfile.sas";;
   then selektion=0;
   else selektion=1;
run;

你不能在宏而不是文件中使用这些行吗?

%macro mymacro;
  and a=0
  and b=0
%mend;

data y;
   set x;
   if 1=1 
      %mymacro
   then selektion=0;
   else selektion=1;
run;

如果myfile.sas 保持原样,你可以用这种相当复杂的(但仍然是通用的)方式解决它:

filename myfile temp;

data _null_;
file myfile2;
infile 'myfile.sas' eof=end;
input;
if _n_=1 then put '%macro mymacro;';
put _infile_;
return;
end:
  put '%mend;';
run;
%include myfile;

data y;
   set x;
   if 1=1 
      %mymacro
   then selektion=0;
   else selektion=1;
run;

答案 1 :(得分:1)

%INCLUDE需要位于语句边界。您可以将IF 1=1放入同一文件或另一个文件中。确保包含分号以结束%INCLUDE命令,但不要在文件的内容中包含分号。

data y;
   set x;
%include incl("if1file.sas","myfile.sas") ;
   then selektion=0;
   else selektion=1;
run;

更好的解决方案可能是将代码放入宏变量(如果小于64K字节)。

%let condition=
and a = 0
and b = 0
;

data y;
   set x;
   if 1=1 &condition then selektion=0;
   else selektion=1;
run;

如果长度超过64K字节,则将其定义为宏。

%macro condition;
and a = 0
and b = 0
%mend;

data y;
   set x;
   if 1=1 %condition then selektion=0;
   else selektion=1;
run;

答案 2 :(得分:1)

根据SAS文档:

  

%INCLUDE声明

     

将SAS编程语句,数据行或两者引入当前的SAS程序。

您尝试的注射不是完整的声明,因此失败。您正在描述的操作的更具体描述将是%INLINE。但是,没有这样的SAS声明。

让我们调用一个输出代码a' codegener'以及它产生' codegen'

的输出

在您使用的上下文中,codegen特定于单个语句。这强烈建议代码应该将codegen放在一个宏变量中(以便以后使用)而不是文件。

假设代码使用有关语句构造的数据:

DATA statements_meta;
  length varname $32 operator $10 value $200;
  input varname operator value;
  datalines;
a = 0
b = 0
run;

并且代码编辑器是数据步骤

DATA _null_;
  file "myfile.snippet";
  ... looping logic over data for statement construction ...
    put " and " varname " = 0 "
  ...
run;

将代码更改为更像以下内容:

DATA _null_;
  length snippet $32000;
  snippet = "";
  ... looping logic over data for statement construction ...
    snippet = catx (" ", snippet, "and", varname, comparisonOperator, comparisonValue);
  ... end loop
  call symput('snippet', trim(snippet));
  stop;
run;
...
DATA ...
  if 1=1 &snippet then ... else ...
run;