VBAでCSVファイルを取り込む方法2/2

前回記事をもとに、CSVファイルの取り込み方法を書いていきます。ダブルクオーテーションで囲まれるCSVファイルの取り込み方法の記事はあまりないので、参考としていただければと思います。

ファイルをバイナリで取り込む

いろいろな読み込み方法があると思いますが、改行コードを含めて読み込むために、まずはバイナリですべてのデータを一つの変数で読み込みます(Byte型)。その後UniCode変換しString型とします。

   Dim b_buf() As Byte '各行のバイナリ―データ(シリアル)
   Dim data_buf As String '上記のUniCode変換結果(シリアル)
  '----------------------------------
   '(1) バイナリ―データとして一括読み込み
   '----------------------------------
   Open OpenFileName For Binary As #1
       ReDim b_buf(1 To LOF(1))        '1から始まる
       Get #1, 1, b_buf
   Close #1
    '----------------------------------
   '(2) 読み込んだデータをUnicodeに変換
   '----------------------------------
   data_buf = StrConv(b_buf, vbUnicode)

ヘッダ情報を取り除く

すぐにデータが始まればいいですが、冒頭にヘッダがある場合は、ヘッダ情報を取り除きます。なお、ヘッダ内には改行コードがないことが前提になります。

    '-------------------------------------------------------
   '(3) ヘッダ情報を取り除く
   '-------------------------------------------------------
    Dim tmpRow As Variant
      tmpRow = Split(data_buf, vbCrLf) 'バッファデータをCRLFで分割

   Dim startOfRow As Long
       startOfRow = Len(tmpRow(0)) + 3  'ヘッダ情報がダブルクオーテーションで囲まれている場合。囲まれていない場合は、CRLFの2文字(+2)とする。
        data_buf = Mid(data_buf, startOfRow)                       'ヘッダ以降のデータを取得する

前後のダブルクオーテーションを取り除き行データを取得する

データがダブルクオーテーションで区切られている場合、行区切り文字が「”"""&vbCrLF&""""」となるため、この文字を行区切り文字としてデータを配列として取得します。なお、データ取り込みにあたり、区切り文字に該当しない前後の文字を取り除く必要があります。

  data_buf = Mid(data_buf, 2)          'まず先頭の「"」を取り除く
   Dim row As Variant
   row = Split(data_buf, """" & vbCrLf & """")   '"Crlf"」区切で各行を配列に格納する。
   row(UBound(row)) = Left(row(UBound(row)), InStrRev(row(UBound(row)), """") - 1) '最終行のデータの「"」以降を取り除く

最後に行ごとに各項目のデータを配列に格納し配列データをディクショナリなどに格納する

格納の仕方はいろいろあるかと思いますが、各行のキーが先頭にある場合、先頭のデータをキーとしてディクショナリに格納して、キーをもとに各行のデータ(配列)を取り出して使います。

ヘッダがある場合は、ヘッダーをキーとするディクショナリを作成したうえで、先頭データをキーとする別ディクショナリにヘッダをキーとするディクショナリを格納して個々のデータを取り出すことでより使いやすくなるかと思います。

Dim i
Set physicalData = New Dictionary ’Publicで定義しておく

For i = 0 To UBound(row)
              '--------------------------------
       '行のデータを区切文字(列)で分割
       '--------------------------------
       Dim rowData As Variant
           rowData = Split(row(i), """,""")
       
       '----------------------------------------------------------
       '各行の配列データを、先頭データをキーとしてディクショナリに格納
       '----------------------------------------------------------
        physicalData.Add rowData(0), rowData
Next

いかがでしたでしょうか。

おおざっぱにコードを書いたので誤りがあるかもしれませんが、だいたいこんな感じでコードを書くとCSVファイルを読み込むことができます。


この記事が気に入ったらサポートをしてみませんか?