投稿

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

UTF-8 環境で、Shift-JIS の固定長ファイルを読み込むのって大変という話 - SAS

イメージ
前回の記事、「 Shift-JIS の固定長ファイルを UTF-8 環境に読み込む (kcvt関数) - SAS 」の余談。 「 Shift-JIS の固定長ファイルを UTF-8 環境に読み込む (kcvt関数) - SAS 」 にて、kcvt 関数を用いて、ファイルを読み込んでみました。 テスト用に用いたファイルでは、文字コード変換が必要な項目は1項目だけだったので、まだ良かったのですが、もし変換しなければならない項目が10項目、20項目、、、とあると、その項目の数だけ、length ステートメントと kcvt 関数を書かなければなりません。 これはとても面倒くさいです。 filename ステートメント、または infile ステートメントにて使用できる encoding= オプションを用いれば読め...ません。 このオプションは、CSV ファイルや TSV ファイルのように、区切り文字(セパレータ)があれば使えますが、固定長ファイルでは理想通りには使うことができません。 前回の記事のテストコードを流用して、固定長ファイルの読み込み時に encoding= を使うと、どうなるのか試しに使ってみます。 テストコード - encoding=sjis を追加 filename IN "/folders/myfolders/test.txt" ; data TEST ; infile IN recfm=F lrecl=28 encoding=sjis ; input @001 CUSTOMER_ID 5. @006 NAME $20. @026 AGE 2. ; run ; 実行ログ 56 filename IN "/folders/myfolders/test.txt" ; 57 58 data TEST ; 59 infile IN recfm=F lrecl=28 encoding=sjis ; 60 input @001 CUSTOMER_ID 5. 61 ...

Shift-JIS の固定長ファイルを UTF-8 環境に読み込む (kcvt関数) - SAS

イメージ
読み込む固定長ファイル(Shift-JIS) 1~ 5バイト:顧客ID 6~25バイト:顧客名 26~27バイト:年齢 28バイト:改行コード(LF) 00001さとう たろう 27 00002こばやし さなえ 54 00003みたらい しょう 22 00004やぶき かける 24 00005はやし けんた 21 テストコード filename IN "/folders/myfolders/test.txt" ; data TEST ; infile IN recfm=F lrecl=28 ; input @001 CUSTOMER_ID 5. @006 NAME $20. @026 AGE 2. ; run ; Shift-JIS 環境に読み込むときは、上記のような感じでいいのですが、UTF-8 環境に読み込ませるときちんと読み込めません。 テストコード (修正) data TEST ; infile IN recfm=F lrecl=28 ; length NAME $30. ; input @001 CUSTOMER_ID 5. @006 NAME $20. @026 AGE 2. ; NAME = kcvt(NAME, 'sjis', 'utf8') ; run ; kcvt関数で、Shift-JIS の値を UTF-8 に変換します。第1引数に変換する項目、第2引数に変換前の文字コード、第3引数に変換後の文字コードを記載します。 これで文字コードを変換することができますが、input ステートメントの前に、length ステートメントで項目の長さを長くしておく必要があります。Shift-JIS は1文字1~2バイトで表現されますが、UTF-8は1文字1~4バイトで表現されます(IVSを入れれば、7, 8バイトもありますが)。なので、長さをそのままにしておくと文字切れが発生してしま...

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