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

SAS将代码包含到数据步骤中,sas,include,datastep,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

我已动态创建了一个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语句中?

事实上,这不起作用。可以在数据或过程步骤中使用%include向其中添加一些行,但不能在不完整语句中使用

您的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;

事实上,这是行不通的。可以在数据或过程步骤中使用%include向其中添加一些行,但不能在不完整语句中使用

您的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;
%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;
%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;

根据SAS文件:

%包含语句

将SAS编程语句、数据线或两者都带到当前SAS程序中

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

让我们将输出代码的程序称为“codegener”,并将其产生的输出称为“codegen”

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

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

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;
将codegener更改为更像以下内容:

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;

根据SAS文件:

%包含语句

将SAS编程语句、数据线或两者都带到当前SAS程序中

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

让我们将输出代码的程序称为“codegener”,并将其产生的输出称为“codegen”

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

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

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;
将codegener更改为更像以下内容:

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;