2019年6月27日木曜日

「FMTERR」と「NOFMTERR」の機能と落とし穴




以下のようなログメッセージが出たことありませんか。

  • 「ERROR: 出力形式XXを変数XXにロードできません」
  • 「ERROR: 出力形式XXが見つからないか、またはロードできません。」



これは「存在しないフォーマットがデータセットに割り当てられている場合」に、現れるメッセージです。
このメッセージを制御しているのが「FMTERR」と「NOFMTERR」というシステムオプションです。




「Windows版SAS」では以下のシステムオプションがデフォルト設定となっています。

options fmterr;


「SAS Ondemand for Academics」では以下がデフォルト設定となっています。

options nofmterr;


それぞれがどんな動きか見ていきましょう。




FMTERR


以下は変数SEXに「$aaa」、変数BIRTHに「yymmdd10」というフォーマットを割り当てています。

options fmterr;

data test;
    format sex $aaa. birth yymmdd10.;
    sex = "FEMALE";
    birth = '26jun2019'd;
run;


--- Log ---------------------

しかし「$aaa」というフォーマットを事前に定義していなかったので、、「$aaaなんてフォーマット見つからんよ!!」とブチ切れられて処理がストップしちゃいました。



NOFMTERR


そこで「NOFMTERR」を指定してやると、

options nofmterr;

data test;
    format sex $aaa. birth yymmdd10.;
    sex = "FEMALE";
    birth = '26jun2019'd;
run;


--- Log ---------------------



--- Dataset ----------------


「フォーマット見つからないよ」と優しめに言われるものの、一応フォーマット$aaaが割り当てられて、処理を続けてくれます。

「NOFMTERR」が設定されてる間は、フォーマットが見つからなかった箇所を(通常は) 出力形式「w.」または「$w.」として扱ってくれます。





NOFMTERRの落とし穴


今度は以下のように「$aaa1.」というようにフォーマットに長さも指定した場合は、、

options nofmterr;

data test;
    format sex $aaa1. birth yymmdd10.;
    sex = "FEMALE";
    birth = '26jun2019'd;
run;



あれ、「FEMALE」の文字が「F」になってる。


実はフォーマットの長さの部分だけは見てくれるようです。つまり「$aaa1.」は「$1.」として扱われる。


あと例えば数値変数に対して「bbb8.2」みたいな感じで存在しないフォーマットを割り当てた場合も「8.2」として扱われる。


中途半端だな・・・




0 件のコメント:

コメントを投稿