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バイトもありますが)。なので、長さをそのままにしておくと文字切れが発生してしまう恐れがあります。そこで、input ステートメントの前に長さを指定しているわけです。
長さの指定は、input の前でなくてはなりません。input の後だと WARNING が出て長さの指定は無視されてしまいます。
57 data TEST ; 58 infile IN recfm=F lrecl=28 ; 59 input @001 CUSTOMER_ID 5. 60 @006 NAME $20. 61 @026 AGE 2. 62 ; 63 length NAME $30. ; WARNING: 文字変数NAMEの長さはすでに設定されています。 文字変数の長さを宣言するには、 DATAステップの最初にLENGTHステートメントを使用してください。 64 NAME = kcvt(NAME, 'sjis', 'utf8') ; 65 run ;
(2015/09/20 追記) 余談:
「UTF-8 環境で、Shift-JIS の固定長ファイルを読み込むのって大変という話 - SAS」
コメント
コメントを投稿