小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


ExcelマクロでUTF8の固定長ファイルを読み込んで表示させてみる

はじめに

ExcelマクロでUTF-8エンコーディングされた固定長ファイルを読み込んで、ワークシート上に表示させてみました。

Excel VBAのプログラミングのツボとコツがゼッタイにわかる本
秀和システム (2014-03-19)
売り上げランキング: 1,734

ファイルレイアウト

今回用意した固定長ファイルは以下のようなレイアウトです。

  • ユーザID:5byte
  • 氏名:20byte
  • ふりがな:20byte
  • 生年月日:8byte

バイナリエディタで見ると、こんな感じで改行コードを含まずデータが連続して配置されているようなファイルです。バイトオーダーマーク (byte order mark) は今回含んでいません。
f:id:replication:20140831164346p:plain

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

このあたりは、以下のページが参考になります。

 ADODB.Streamを使った文字コードの取り扱い (2) - Ci.nsIZIGOROu - Mozilla 拡張機能勉強会 ADODB.Streamを使った文字コードの取り扱い (2) - Ci.nsIZIGOROu - Mozilla 拡張機能勉強会
Excel で UTF-8 の CSV ファイルを出力する VBA プログラム - 知に至る病Excel で UTF-8 の CSV ファイルを出力する VBA プログラム - 知に至る病

固定長データの取り出し

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
実行結果

f:id:replication:20140831171552p:plain

関連記事