投稿

2月, 2015の投稿を表示しています

文字切れを除去する方法 (UTF-8) - SAS

データ/ファイルが色んなDBやらツールやらを介していると、文字の長さが異なったりして、文字切れが発生することがあります。ここでいう文字切れとは、例えば、15バイト/5文字で表現できる文字を14バイトしか読み込まず(読み込めず)、最後の1文字が文字として認識されない状態になることです。「ありがとう」という文字が文字切れが起きると、最後の「う」が認識されなくなり、「ありがと◆」と表示されてしまうみたいな感じです。 文字切れが起きてしまうと、表示がおかしくなってしまいますし、他のシステムにデータを渡した時、エラーが起きてしまう原因になることもあります。 今回は、文字切れがどうしても起きてしまう時の対処方法についてのお話です。 文字切れは、klengthとksubstrを使用することで除去することができます。klengthが、文字切れ部分を文字として認識しないのを利用した方法です。 関数の説明 length 文字のバイト数を取得 klength 文字の文字数を取得 substr ○バイト目~○バイト目を取得 ksubstr ○文字目~○文字目を取得 サンプルコード data TEST ; length A $15. B $15. ; /* UTF-8 で以下の全角文字は、1文字3バイト */ A = "あいうえお" ; /* 項目 B で文字切れを作る */ B = substr(A, 1, 14) ; C = klength(B) ; D = length(B) ; output ; B = substr(A, 1, 13) ; C = klength(B) ; D = length(B) ; output ; run ; data TEST ; set TEST ; if not missing(A) then do ; E = ksubstr(A, 1, klength(B)) ; F = length(E) ; end ; run ; proc print data=TEST ; run ; 項目 E のところが、文字切れをカットしているところです。項目 B で、13,14バイトに文字を切っていますが、文字切れ部分をカットした後、項目 F では12バ

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