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

コメント

このブログの人気の投稿

日付フォーマットでない文字項目をSAS日付に変換するときにログ出力されるメッセージを抑制したい - SAS

データセット(.sas7bdatファイル)の文字コードを取得したい - SAS

Linuxコマンド: date で◯か月前 / ◯か月後を取得するときの注意