CSVファイル読み込み

薀蓄

 CSVファイルの読み込み処理として,以下の様な実装を良く見掛けます。
他山の石
Option Explicit

Dim	objFileSystem
Dim	objStream
Dim	strLine
Dim	arrFields
Dim	strMessage

Set objFileSystem = CreateObject("Scripting.FileSystemObject")
Set objStream = objFileSystem.OpenTextFile(Left(WSH.ScriptFullName,Len(WSH.ScriptFullName) - Len(WSH.ScriptName)) & "\CSV_TEST.csv", 1)

Do Until objStream.AtEndOfStream
	strLine = objStream.ReadLine
	arrFields = Split(strLine,",")
	strMessage = strMessage & arrFields(1) & "(" & arrFields(2) & ")" & vbCrLf
Loop

MsgBox strMessage, vbInformation + vbOkOnly, "読み込み結果"

objStream.Close
Set	objStream = Nothing
Set	objFileSystem = Nothing
 これのどこが駄目なのと思われる方もいらっしゃるでしょうが,データによってはカンマが入力される事もあるでしょうし,場合によってはデータ内に改行が含まれることもあるかも知れません。なので,上記の処理では正しく扱えるデータに制限が出てしまいます。実際,以下のデータを上記スクリプトに掛けると,キャプチャの結果が得られます。
難物(CSV_TEST.csv)
1,試験 太郎,35,メモ
2,hoge,28,備考
3,"Rechard,Matthew,Stallman",53,memo
 そこで,今回はCSVをスマートに読み込む方法を紹介したいとこの様に思う訳です。

ソース

 カンマで分割しないとなるとではどうするのかと言いますと,OLEDBにTextFileドライバなるドライバがありまして,そちらを利用します。自前で処理しても良いのですが,以下に紹介する方法が使えるのであれば使わない手はありません。Microsoft謹製なので,何かあった時に言い訳が効きますし。;b
まじめにきちんと
Option Explicit

Dim	objConn
Dim	objRecordset
Dim	strOut

Set objConn = CreateObject("ADODB.Connection")

objConn.ConnectionString = _
	"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Left(WSH.ScriptFullName,Len(WSH.ScriptFullName) - Len(WSH.ScriptName)) & "\table\;" & _
	"Extended Properties=""text;HDR=NO;FMT=Delimited;"";"
objConn.Open

Set objRecordset = objConn.Execute("select * from CSV_TEST.csv")

Do Until objRecordSet.EOF
	strOut = strOut & vbCrLf & objRecordset.Fields("name") & "(" & objRecordset.Fields("age") & ")"
	objRecordset.MoveNext
Loop

MsgBox strOut, vbInformation + vbOkOnly, "読み込み結果"

objRecordset.Close
objConn.Close

Set objRecordset = Nothing
Set objConn = Nothing
 今回はCSVファイルなので定義ファイル無しでもそこそこ動くのですが,読み込むテキストファイルの形式を設定ファイルで指定する事ができます。今回使用した設定ファイルを以下に挙げます。
設定(Schema.ini)
[CSV_TEST.csv]
ColNameHeader=False
Format=CSVDelimited
CharacterSet=OEM
Col1=id Long
Col2=name Text
Col3=age Byte
Col4=remark Memo
 ではこちらで先程のCSVファイルを読み込んでみてください。(*1)今度は以下のキャプチャの様に正常に読み込まれるはずです。
*1) プログラムを保存したディレクトリ下にtableディレクトリを掘って,その直下にCSVファイルと設定ファイルを置いて実行します。

放言

 CSVよりTSV(タブ区切りデータ)の方が扱いやすい,との話はよく耳にするかと思います。確かに,カンマよりはタブの方がデータとしては入り難いとは思うのですが,TSVにした所で根本的な解決にはならない事は自ずから明らかでもまたあります。運用でカバー,等と障害を自ら招く真似はいい加減止して,真面目に処理する様心掛けましょう。

リンク