3

最初の行にヘッダー情報がある入力ファイルがあります。(タブ区切りのデータ値)。これらの値の中には、ファイルの残りの部分を解析する方法を指定する整数値があります。この値がしきい値よりも小さい場合は、ファイルを 1 つの方法で解析する必要があります。値がしきい値よりも大きい場合は、別の方法でデータを解析する必要があります。

%let isNew = Undefined;

data header;
infile "&infile" OBS=1;
INPUT Agency $ Status $ Num $ fdate sdate;
if fdate < 20130428 then
 %let isNew = false;
else
 %let isNew = true;
run;

data factors;
infile "&infile" missover FIRSTOBS=2 LRECL=1000;
if isNew = false then
 input
   @1   poolno                  $6.
   @7   factor                  9.8 @;
else
 input
   @3   poolno                  $6.
   @9   factor                  9.8 @;

(some more input parsing code)

上記のコードでは、変数 isNew を定義し、条件チェックに応じてその変数を true/false に設定しています。後続のデータ ブロックでは、この変数の値を使用して、ファイルを解析する方法を決定しています。

サンプルの入力ファイルは次のとおりです (調べる値は太字で示されています)。

FHLMC アップデート #1 20130130 20130306

138788024201321000

140379000000000000

私は SAS を初めて使用します。何か提案はありますか?

4

1 に答える 1

4

データ ステップ変数とマクロ変数を混同しています。そのような %LET ステートメントを条件付きで実行することはできません (実行したくありません)。CALL SYMPUT は、必要に応じてマクロ変数を作成する方法です。ただし、この場合は必要ありません。これはすべて 1 つのデータ ステップで実行できるためです。

data want;
informat fdate sdate YYMMDD8.;
retain Agency Status Num fdate sdate;
if _n_ = 1 then do;
  input Agency $ Status $ Num $ fdate sdate;
end;
else do;
    if fdate < '28APR2013'd then input
       @1   poolno                  $6.
       @7   factor                  9.8;
    else
     input
       @3   poolno                  $6.
       @9   factor                  9.8;

    output;
end;
datalines;
MyAgency MyStatus MyNum 20130401 20130501
MyPool123456783123
MyPoo2435678904123
;;;;
run;

ここで注意すべき点が 1 つあります。10 進数のない数値を追加する場合を除き、通常は入力形式に 10 進数を追加しません (つまり、@9 係数 9.8)。IE、私が作成したデータには、10 進数 (123456783) がありませんでした。ただし、10 進数が既にデータに含まれている場合、つまり 1.23456783 がデータ ファイルに含まれている場合は、単に 9 と入力して、SAS に小数点を配置させます。また、これをテストする場合は、データ行を最初の列に移動してください (データ行を 4 つインデントすると失敗します)。

また、SAS 日付の操作方法を学ぶ必要があります。私がどのように変更したかを確認してください。

于 2013-03-11T14:47:31.883 に答える