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 秒
コメント
コメントを投稿