薀蓄
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
1,試験 太郎,35,メモ
2,hoge,28,備考
3,"Rechard,Matthew,Stallman",53,memo
ソース
カンマで分割しないとなるとではどうするのかと言いますと,OLEDBにTextFileドライバなるドライバがありまして,そちらを利用します。自前で処理しても良いのですが,以下に紹介する方法が使えるのであれば使わない手はありません。Microsoft謹製なので,何かあった時に言い訳が効きますし。;bOption 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_TEST.csv]
ColNameHeader=False
Format=CSVDelimited
CharacterSet=OEM
Col1=id Long
Col2=name Text
Col3=age Byte
Col4=remark Memo
*1) プログラムを保存したディレクトリ下にtableディレクトリを掘って,その直下にCSVファイルと設定ファイルを置いて実行します。
放言
CSVよりTSV(タブ区切りデータ)の方が扱いやすい,との話はよく耳にするかと思います。確かに,カンマよりはタブの方がデータとしては入り難いとは思うのですが,TSVにした所で根本的な解決にはならない事は自ずから明らかでもまたあります。運用でカバー,等と障害を自ら招く真似はいい加減止して,真面目に処理する様心掛けましょう。リンク
- ExcelのCSV形式(古いですが...。)
- 設定ファイル形式
- 「データベースまたはオブジェクトは読み取り専用なので,更新できません。」と怒られたらここを。