簡體   English   中英

SAS將代碼包含到數據步驟中

[英]SAS include code into data step

我已經動態創建了一個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語句中?

確實,這是行不通的。 您可以在dataproc步驟中使用%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;

根據SAS文檔:

%INCLUDE語句

將SAS編程語句和/或數據行帶入當前SAS程序中。

您嘗試的注入不是完整的語句,因此失敗。 您要描述的操作的更具體描述為%INLINE。 但是,沒有此類SAS聲明。

讓我們將一個輸出代碼的程序稱為“ codegener”,並將其輸出產生“ codegen”

在您使用的上下文中,代碼生成特定於單個語句。 這強烈表明代碼生成器應將代碼生成器放置在宏變量中(以便以后使用)而不是文件中。

假設代碼生成器使用有關語句構造的數據:

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

而代碼生成器是DATA步驟

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM