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ファイルを読み込むことができます。
この記事が気に入ったらサポートをしてみませんか?