3

私はSASを初めて使用し、単純なIf-Then-elseをいつ使用すべきか、%IF-%THEN-%ELSEをいつ使用すべきかを判断するのに苦労しています。以下のサンプルコードとして:

%let inFile = %scan(&sysparm, 1, " ");
%macro read_data(infile);
data want;
infile "&infile" LRECL=1000;
retain fdate;
if _n_ = 1 then do;
  input Agency $ Status $ Num $ fdate sdate;
end;
else do;
   %if fdate < 20130428  %then
   input
   @1   poolno                  $6.
   @7   factor                  9.8 @;
   %else
   input
   @1   rectype                 $1
   @3   poolno                  $6.
   @9   factor                  9.8 @;

   @18 pfactor                 9.8;
output;
end;
drop Agency Status Num sdate;
run;
proc print data=want;
run;
%mend read_data;
%read_data(&inFile);

最初の行(ヘッダー)を取得し、パラメーターfdateを取得しようとしています。このパラメーターの値に基づいて、後続の入力行を異なる方法で解析しています。ただし、2番目の入力部分のみが実行されるため(常に出力でパラメーター'rectype'を取得するため)、これは機能しないようです。

私が間違っているかもしれないこととして何か提案はありますか?

4

4 に答える 4

2

タグの1つとしてC++があり、SASを使い始めたばかりだと思います。だから私はあなたのバックグラウンドに固有の答えを提供しようとします。

SASマクロコマンドとDATAステップまたは同じ名前の複数のプロシージャ(%ifとifのように)のコマンドの違いを理解する最も簡単な方法は、SASマクロコマンドをC /C++プリプロセッサと同等であると考えることです。 (CPP)ディレクティブ。CPPとSASMAcroはどちらもマクロ言語であり、まったく同じ種類の言語ではありませんが、2つの重要で、最初は紛らわしい特性を共有しています。そして、それらはメインコードが処理される前に別のステップとして実行されます。

この近似が崩れる場所もありますが、C / C ++のバックグラウンドを持つSASの初心者として、始めるのに適した場所です。

于 2013-03-13T02:17:37.003 に答える
1

マクロ ステートメント %if は、データ ステップ ステートメントの前にコンパイルされます。つまり、通常、ロジック式でデータ ステップ変数を使用することはできません。マクロ プロセッサがマクロ ステートメントをコンパイルしているとき、データ ステップ変数はまだ存在しません。

于 2013-03-19T23:14:50.317 に答える
0

SASを実行する場合、値odと。ではなく%if fdate < 20130428リテラルfdateを比較します。20130428fdate20130428

名前の付いたマクロ変数がある場合は、次のfdateようにします%if &fdate < 20130428

あなたの場合fdateはデータセット内の変数なので、使用しifない%ifでください。ただし、マクロを使用してデータステップを作成しようとしているようです。そのためif、この場合は使用するだけではおそらく機能しません(取得しようとしているものによって異なります)。

于 2013-03-12T14:43:57.670 に答える
0

上記の例では、%IF 条件はデータステップ変数/値に基づいています。これは、%IF ではなくデータステップ 'if' を使用して達成できることを示しているはずです。

以前の質問https://stackoverflow.com/a/15341502/108797で、これに対する回答を既に受け取っています。

于 2013-03-12T14:07:10.237 に答える