NOTE: 以下の箇所で◯◯を◯◯に変換しました。~SASログ入門 #2~
今回の注目ログメッセージは、
- NOTE: 以下の箇所で数値を文字値に変換しました。
- NOTE: 以下の箇所で文字値を数値に変換しました。
の、2つです。
「NOTE: 以下の箇所で数値を文字値に変換しました。」
data TEST ; length STR $5. ; /* 変数STRは文字です */ STR = 1234 ; putlog STR= ; run ;
上記のdataステップでは、変数STRをlengthステートメントで文字として定義しています。その文字変数STRに対して、数値1234 を格納しようとしています。
60 data TEST ; 61 length STR $5. ; /* 変数STRは文字です */ 62 STR = 1234 ; 63 putlog STR= ; 64 run ; NOTE: 以下の箇所で数値を文字値に変換しました。 (行:カラム) 62:9 STR=1234 NOTE: データセットWORK.TESTは1オブザベーション、1変数です。 NOTE: DATAステートメント処理(合計処理時間): 処理時間 0.02 秒 CPU時間 0.02 秒
文字変数に対して、数値は格納できないので、1234という数値は文字に変換されて、変数STRに格納されます。このとき、ログに、「NOTE: 以下の箇所で数値を文字値に変換しました。」が出力されます。このメッセージは、文字が入るべき箇所で数値が来ると出力されるログメッセージです。
代入式だけでなく関数の引数でも発生します。substr関数の第1引数は文字であるべきですが、下記のコードでは数値が記載されています。
63 data _null_ ; 64 STR = substr(123, 1, 1) ; 65 run ; NOTE: 以下の箇所で数値を文字値に変換しました。 (行:カラム) 64:16 NOTE: DATAステートメント処理(合計処理時間): 処理時間 0.00 秒 CPU時間 0.01 秒
また、このメッセージは、代入式のときだけでなく、call symput を用いてマクロ変数を格納しようとしたときにも発生します。
59 data _null_ ; 60 call symput("TEST", 1234) ; 61 run ; NOTE: 以下の箇所で数値を文字値に変換しました。 (行:カラム) 60:23 NOTE: DATAステートメント処理(合計処理時間): 処理時間 0.01 秒 CPU時間 0.01 秒
このメッセージを回避するには、put関数を用いて、自分で数値を文字に変換させる必要があります。call symput の場合は、call symputx を用いるのも回避方法の1つです。
58 data TEST ; 59 NUM = 1234 ; 60 length STR $5. ; /* 変数STRは文字です */ 61 STR = put(NUM, 5.) ; 62 putlog STR= ; 63 run ; STR=1234 NOTE: データセットWORK.TESTは1オブザベーション、2変数です。 NOTE: DATAステートメント処理(合計処理時間): 処理時間 0.02 秒 CPU時間 0.02 秒 64 65 data _null_ ; 66 NUM = 1234 ; 67 call symput("TEST1", put(NUM, 4.)) ; 68 69 /* call symputx であれば、put関数で数値を文字に変換する必要はありません */ 70 call symputx("TEST2", NUM) ; 71 run ; NOTE: DATAステートメント処理(合計処理時間): 処理時間 0.01 秒 CPU時間 0.01 秒 72 %put &=TEST1. &=TEST2. ; TEST1=1234 TEST2=1234
「NOTE: 以下の箇所で文字値を数値に変換しました。」
逆パターンのログメッセージです。きちんと数値に変換されないことがあるので、逆パターンとはいえ、厄介なメッセージです。
data TEST ; NUM = 12345 ; /* 変数NUMは数値です */ NUM = "99999" ; putlog NUM= ; run ;
上記のdataステップでは、変数NUMに12345を格納して数値として定義しています。そして、数値変数NUMに対して、文字"99999"を格納しようとしています。
67 data TEST ; 68 NUM = 12345 ; /* 変数NUMは数値です */ 69 NUM = "99999" ; 70 putlog NUM= ; 71 run ; NOTE: 以下の箇所で文字値を数値に変換しました。 (行:カラム) 69:9 NUM=99999 NOTE: データセットWORK.TESTは1オブザベーション、1変数です。 NOTE: DATAステートメント処理(合計処理時間): 処理時間 0.00 秒 CPU時間 0.00 秒
数値変数に対して、文字は格納できないので、文字を数値に変換してから、文字変数に値が格納されます。このとき、ログに出力されるメッセージが、「NOTE: 以下の箇所で文字値を数値に変換しました。」です。
数値が入るべきところに文字が入ってきたため出力されるメッセージです。先のメッセージと同様に、関数内でも発生します。substr関数の第2, 3引数は数値であるべきですが、文字が記載されています。
58 data _null_ ; 59 STR = substr("ABC", "1", "1") ; 60 run ; NOTE: 以下の箇所で文字値を数値に変換しました。 (行:カラム) 59:23 59:28 NOTE: DATAステートメント処理(合計処理時間): 処理時間 0.00 秒 CPU時間 0.02 秒
文字を数値に変換しようとするので、この文字の値が、数値に変換できるような値でないといけません。もし変換できないような値の場合、「NOTE: 無効な数値データ~」と言われて怒られてしまいます。このとき、数値変数には欠損値が格納されます。
59 data TEST ; 60 NUM = 12345 ; /* 変数NUMは数値です */ 61 NUM = "ABC" ; 62 putlog NUM= ; 63 run ; NOTE: 以下の箇所で文字値を数値に変換しました。 (行:カラム) 61:9 NOTE: 無効な数値データ'ABC'が行 61 カラム 9にあります。 NUM=. NUM=. _ERROR_=1 _N_=1 NOTE: データセットWORK.TESTは1オブザベーション、1変数です。 NOTE: DATAステートメント処理(合計処理時間): 処理時間 0.02 秒 CPU時間 0.03 秒
「NOTE: 以下の箇所で文字値を数値に変換しました。」をログに出力させないようにするには、input関数を用いて、自分で文字を数値に変換させる必要があります。
59 data TEST ; 60 STR = "12345" ; 61 NUM = 12345 ; /* 変数NUMは数値です */ 62 NUM = input(STR, best.) ; 63 run ; NOTE: データセットWORK.TESTは1オブザベーション、2変数です。 NOTE: DATAステートメント処理(合計処理時間): 処理時間 0.01 秒 CPU時間 0.01 秒
数値にならない文字を input関数で変換しようとすると、「NOTE: 関数INPUT (~)の引数は無効です。」と言われ怒られ、欠損値が格納されます。また、オブザベーションの内容がログに出力されてしまいます。
これを出なくするには、?, または ?? を input関数に入れるだけです。「日付フォーマットでない文字項目をSAS日付に変換するときにログ出力されるメッセージを抑制したい - SAS」という記事で、?, ?? について紹介してますので、ご参考ください。
65 data TEST ; 66 STR1 = "ABC" ; 67 NUM = 12345 ; /* 変数NUMは数値です */ 68 NUM = input(STR1, best.) ; 69 run ; NOTE: 関数INPUT (行 68 カラム 9)の引数は無効です。 STR1=ABC NUM=. _ERROR_=1 _N_=1 NOTE: 以下の箇所で演算式を計算できなかったため、結果を欠損値に設定しました。 (回数)(行:カラム) 1 68:9 NOTE: データセットWORK.TESTは1オブザベーション、2変数です。 NOTE: DATAステートメント処理(合計処理時間): 処理時間 0.02 秒 CPU時間 0.02 秒 70 71 data TEST ; 72 STR2 = "ABC" ; 73 NUM = 12345 ; /* 変数NUMは数値です */ 74 NUM = input(STR2, ? best.) ; 75 run ; STR2=ABC NUM=. _ERROR_=1 _N_=1 NOTE: データセットWORK.TESTは1オブザベーション、2変数です。 NOTE: DATAステートメント処理(合計処理時間): 処理時間 0.00 秒 CPU時間 0.01 秒 76 77 data TEST ; 78 STR3 = "ABC" ; 79 NUM = 12345 ; /* 変数NUMは数値です */ 80 NUM = input(STR3, ?? best.) ; 81 run ; NOTE: データセットWORK.TESTは1オブザベーション、2変数です。 NOTE: DATAステートメント処理(合計処理時間): 処理時間 0.00 秒 CPU時間 0.00 秒
input関数で変換する前に、文字が数値に変換できるかどうかをチェックしたい場合は、verify関数を用います。
60 data TEST ; 61 length STR $10. ; 62 STR = "12345" ; output ; 63 STR = " ABC" ; output ; 64 run ; NOTE: データセットWORK.TESTは2オブザベーション、1変数です。 NOTE: DATAステートメント処理(合計処理時間): 処理時間 0.01 秒 CPU時間 0.02 秒 65 66 data TEST2 ; 67 set TEST ; 68 if verify(trim(STR), '0123456789') = 0 then do ; 69 NUM = input(STR, best.) ; 70 output ; 71 end ; 72 run ; NOTE: データセットWORK.TESTから2オブザベーションを読み込みました。 NOTE: データセットWORK.TEST2は1オブザベーション、2変数です。 NOTE: DATAステートメント処理(合計処理時間): 処理時間 0.01 秒 CPU時間 0.02 秒
コメント
コメントを投稿