日付フォーマットでない文字項目をSAS日付に変換するときにログ出力されるメッセージを抑制したい - SAS

文字項目を数値やSAS日付に変換するとき使う input 関数。指定したフォーマットに合わない無効なデータを引数として渡してしまうと、ログで NOTE: ~の引数は無効です。などと怒られてしまいます。

メッセージを出してほしくない!というときは、input 関数の中に、? を使用することで、ログにメッセージがでなくなります。使用方法は、入力フォーマットの前に ? を記載するだけです。

input(A, ? yymmdd8.) ;

? が1個だけだと、NOTE: ~の引数は無効です。のメッセージが消えて、_ERROR_ のメッセージは出力されます。?? だと両方ログから消えます。


サンプルコード

data TEST ;
  input A $30. ;
cards ;
AAA
こんにちは
さようなら
20140102
20140830
20140229

20120229
run ;

data TEST ;
  set TEST ;
  B = input(A,    yymmdd8.) ;
run ;
data TEST ;
  set TEST ;
  C = input(A, ? yymmdd8.) ;
run ; 
data TEST ;
  set TEST ;
  D = input(A, ?? yymmdd8.) ;
run ;
 

ログ

43 data TEST ;
44 input A $30. ;
45 cards ;
NOTE: データセットWORK.TESTは8オブザベーション、1変数です。
54 run ;
55
56 data TEST ;
57 set TEST ;
58 B = input(A, yymmdd8.) ;
59 run ;
NOTE: 関数INPUT (行 58 カラム 7)の引数は無効です。
A=AAA B=. _ERROR_=1 _N_=1
NOTE: 関数INPUT (行 58 カラム 7)の引数は無効です。
A=こんにちは B=. _ERROR_=1 _N_=2
NOTE: 関数INPUT (行 58 カラム 7)の引数は無効です。
A=さようなら B=. _ERROR_=1 _N_=3
NOTE: 関数INPUT (行 58 カラム 7)の引数は無効です。
A=20140229 B=. _ERROR_=1 _N_=6
NOTE: 以下の箇所で演算式を計算できなかったため、結果を欠損値に設定しました。
(回数)(行:カラム)
4 58:7
NOTE: データセットWORK.TESTから8オブザベーションを読み込みました。
NOTE: データセットWORK.TESTは8オブザベーション、2変数です。
60 data TEST ;
61 set TEST ;
62 C = input(A, ? yymmdd8.) ;
63 run ;
A=AAA B=. C=. _ERROR_=1 _N_=1
A=こんにちは B=. C=. _ERROR_=1 _N_=2
A=さようなら B=. C=. _ERROR_=1 _N_=3
A=20140229 B=. C=. _ERROR_=1 _N_=6
NOTE: データセットWORK.TESTから8オブザベーションを読み込みました。
NOTE: データセットWORK.TESTは8オブザベーション、3変数です。
64 data TEST ;
65 set TEST ;
66 D = input(A, ?? yymmdd8.) ;
67 run ;
NOTE: データセットWORK.TESTから8オブザベーションを読み込みました。
NOTE: データセットWORK.TESTは8オブザベーション、4変数です。
 

この設定をつけてしまうと、指定したフォーマット以外がデータにあることを検知できなくなってしまうので、用途に応じて使う必要があります。例えば、YYYYMMDDしか入ってこないはずの項目に、平成22年という文字が入ってきてしまうとか・・・は検知できなくなります。

ログにメッセージは出力させたくないけど、どのレコードにおかしなデータが入ってくるか知りたい場合は、例えば以下みたいに書きます。missing 関数は、欠損値かどうかを判定する関数です。

data TEST
     TEST_ERR
     ;
  set TEST ;
  if not missing(A) then do ;
    B = input(A, ?? yymmdd8.) ;
    if missing(B) then output TEST_ERR ;
  end ;
  output TEST ;
run ;

proc print data=TEST_ERR ;
  title1 "変なレコード" ;
  title2 "項目Aに、YYYYMMDD以外のデータが入ってるよ!" ;
run ;
 

コメント

このブログの人気の投稿

データセット(.sas7bdatファイル)の文字コードを取得したい - SAS

Linuxコマンド: date で◯か月前 / ◯か月後を取得するときの注意