はじめに
ExcelマクロでUTF-8エンコーディングされた固定長ファイルを読み込んで、ワークシート上に表示させてみました。
Excel VBAのプログラミングのツボとコツがゼッタイにわかる本
posted with amazlet at 14.08.31
秀和システム (2014-03-19)
売り上げランキング: 1,734
売り上げランキング: 1,734
ファイルレイアウト
今回用意した固定長ファイルは以下のようなレイアウトです。
- ユーザID:5byte
- 氏名:20byte
- ふりがな:20byte
- 生年月日:8byte
バイナリエディタで見ると、こんな感じで改行コードを含まずデータが連続して配置されているようなファイルです。バイトオーダーマーク (byte order mark) は今回含んでいません。
UTF-8ファイルを読み込む
UTF-8エンコーディングのファイルを読み込むには、ADODB.Streamオブジェクトを使います。Charsetでエンコーディングを指定し、LoadFromFileメソッドでファイルを読み込みます。
Sub Macro1() Dim utf8Stream As Object Set utf8Stream = CreateObject("ADODB.Stream") utf8Stream.Charset = "UTF-8" Dim inFile As String inFile = "C:\Users\Administrator\Desktop\hoge.dat" utf8Stream.Open utf8Stream.LoadFromFile (inFile) End Sub
UTF-8からShift_JISに変換する
UTF-8からShift_JISへ文字コードの変換を行うには、ADODB.Streamオブジェクトを2つ用意し、CopyToメソッドを使って文字コードを変換しながらストリームをコピーします。
' UTF8ファイルを開く utf8Stream.Open utf8Stream.LoadFromFile (inFile) ' UTF8→SJIS変換を行う sjisStream.Open utf8Stream.CopyTo sjisStream utf8Stream.Close
このあたりは、以下のページが参考になります。
固定長データの取り出し
Shift_JISに変換したあとは、項目ごと決まったbyte数ずつ取り出します。
ユーザIDは5byteなので、sjisStream.ReadText(5)で取り出せます。
次の氏名は先頭から6byte目のところからはじまっているので、sjisStream.Position = 5として、ポジションをずらしてからsjisStream.ReadText(10)で氏名が取得できます。
サンプルプログラム
Sub Macro1() Dim sjisStream As Object Set sjisStream = CreateObject("ADODB.Stream") Dim utf8Stream As Object Set utf8Stream = CreateObject("ADODB.Stream") ' 文字コードの指定 sjisStream.Charset = "Shift_JIS" utf8Stream.Charset = "UTF-8" Dim inFile As String Dim outFile As String inFile = "C:\Users\Administrator\Desktop\hoge.dat" outFile = "C:\Users\Administrator\Desktop\hoge.dat.tmp" ' UTF8ファイルを開く utf8Stream.Open utf8Stream.LoadFromFile (inFile) ' UTF8→SJIS変換を行う sjisStream.Open utf8Stream.CopyTo sjisStream utf8Stream.Close ' SJISストリームをファイルに保存する(ワークシートに表示するだけなら不要) sjisStream.SaveToFile outFile, 2 ' ワークシートに値を出力する sjisStream.Position = 0 Range("B1").Value = sjisStream.ReadText(5) sjisStream.Position = 5 Range("B2").Value = sjisStream.ReadText(10) sjisStream.Position = 25 Range("B3").Value = sjisStream.ReadText(10) sjisStream.Position = 45 Range("B4").Value = sjisStream.ReadText(8) sjisStream.Close End Sub
実行結果
関連記事