2017-11-09 6 views

答えて

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; 

を書かれているだろうか?そのmyfile.sasがそのまま滞在するを持っている場合

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

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

、あなたはこのかなり複雑(それでも一般的な)方法でそれを回避することができます:

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

%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; 
1

SASのドキュメントによると:

%INCLUDE Statement

Brings a SAS programming statement, data lines, or both, into a current SAS program.

あなたがしようとしているの注射は完全なステートメントではありませんので、それは失敗します。記述しているアクションのより具体的な説明は%INLINEです。しかし、そのようなSAS声明はありません。

はのは、コード「codegener」とそれがコード生成が単一のステートメントに固有のご使用の文脈では「codegenを」

生成し出力を出力するプログラムを呼ぶことにしましょう。これは、コードジェネレータがファイルの代わりに(後の使用のために)コード変数をマクロ変数に入れるべきであることを強く示唆しています。

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

とcodegenerは、DATAステップ

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

変更より、以下のようになりcodegenerです:

は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; 
関連する問題