投稿

ラベル(文字型)が付いた投稿を表示しています

文字項目の長さが決定するタイミング - SAS

イメージ
lengthステートメントを使用しない場合、文字の長さが決定するタイミングは、dataステップの中で該当変数が初めて登場してくるところです。 data TEST ; A = "12345" ; output ; A = "01234567890" ; output ; run ; proc contents data=TEST ; run ; 上記のプログラムでは、変数 A に最初の式で5バイトの文字列を格納し、次の式で10バイトの文字列を格納しようとしています。文字の長さは、最初の式で決定するので、変数 A の長さは5バイトです。なので、次の式で10バイトの文字列をすべて格納することはできません。 初めて登場するタイミングで決定すると言いましたが、この「初めて」というのは実行されない式にも当てはまります。 data TEST ; A = 1 ; if A = 0 then B = "1" ; B = "12345" ; run ; proc contents data=TEST ; run ; if 文の中の B = "1" ; は実行されませんが、dataステップの中で「初めて」変数 B が登場するタイミングです。しっくりこないかもしれませんが、ここが変数 B の長さが決定するタイミングで、長さは1バイトとなります。変数の長さは1バイトなので、最後の5バイトの文字列をすべて格納することはできません。 場合によってはバグの元にもなるかもしれないので、事前にlengthステートメントで、文字の長さを決めておくのが良いかと思います。 バグ発生経験者より自戒を込めて 参考サイト SAS Base Programmer 練習問題23 | study SAS

文字切れを除去する方法 (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バ...