投稿

ラベル(入力方式)が付いた投稿を表示しています

SAS 入力方式 $CHARw. VS $w.

入力方式 $CHARw. と $w. は文字を取り込むときに使う入力方式です(w には変数の長さが入ります)。 同じ意味の入力方式かと思いきや、少し動作が異なります。 $CHARw. は、一文字のドット . をきちんと読み込みますが、$w. は読み込まず欠損値となります。 また、頭と末に空白があった場合の動作も、若干異なります。 $CHARw. と $w. の動作の違いを確かめるテストコード data TEST ; infile cards dlm="," dsd missover ; input STR_1 : $char10. STR_2 : $10. ; LEN_1 = length(STR_1) ; LEN_2 = length(STR_2) ; cards ; ABC,DEF .,. ..,.. BC, EF "BC ","EF " " A B C "," D E F " ; run ; proc print data=TEST ; run ; OBS STR_1 STR_2 LEN_1 LEN_2 1 ABC DEF 3 3 2 . 1 1 3 .. .. 2 2 4 BC EF 3 2 5 BC EF 2 2 6 A B C D E F 6 5 一文字のドットがある場合、$CHARw. はそのまま取り込めているのがわかります。$w. は欠損値となっています。 頭と末の空白については、見た目上はわからないですが、length 関数の値が異なる場合があるのがわかります。どうやら、先頭の空白の有無で違いが現れているようで、末の空白は違いがないようです。(ただし、頭と末の空白の扱い方は、...

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...

日付フォーマットでない文字項目を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=...