ちょっと前にVBScriptで作られたツールがあるのですが、最近になってエラーが出るとの連絡。
エラーになるケースは、CSVファイルを読み込んで255Byteを超えている値を扱う時と判明。
対象のツールは実装上ADOが使われており、下記のようにCSVへアクセスしてます。
Set objADO = CreateObject("ADODB.Connection")
objADO.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=CSVファイルのフォルダ;ReadOnly=1}"
Set objRS = objADO.Execute("select * from CSVファイル名")
Do Until objRS.Eof = True
'1番目の項目
colum1 = objRS(0)
'具体的な処理は省略
objRS.MoveNext
Loop
対象のCSVファイルが改行を含む値を扱う都合でADOを使ったようなのですが、どうやら、CSVテキストドライバとしての仕様上、255を超える項目数だったり、255を超えるサイズといった、昔ながらの壁がある模様。
回避策としては、Schema.iniで逃げるのが定番らしいのですが、試したところエラーにはならないが、255文字超が勝手に切られる形に・・・
というか、これ以上ADODBについて調べる時間が無駄!!なので、テキストファイル読み込みとして作り直しました。。
こちらを少し参考にして、さらにダブルクォーテーション内のカンマも考慮し(ここではカンマは削除してます)、ADOのレコードセットっぽく1レコード毎に配列へ列の値をセットしてから処理を行っていきます。
Const sCsvFileName = "C:\Users\XXX\data.csv"
Dim objFSO
Dim objFile
Dim strLine,SpltTmp
Dim i,iDimPos,colum1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(sCsvFileName)
Do While objFile.AtEndOfStream <> True
'CSV列の最大数
Redim strRec(12)
strLine = ""
Do While objFile.AtEndOfStream <> True
strLine = strLine + objFile.ReadLine
If (Len(strLine) - Len(Replace(strLine,"""",""))) Mod 2 = 0 Then Exit Do
strLine = strLine + vbNewLine
Loop
iDimPos = 0
For Each SpltTmp In Split(strLine,",")
If iDimPos > 11 Then
Exit For
End If
If Instr(SpltTmp,"""") = 0 Then
strRec(iDimPos) = SpltTmp
iDimPos = iDimPos + 1
ElseIf Instr(SpltTmp,"""") = 1 And InStrRev(SpltTmp,"""") = Len(SpltTmp) Then
If Instr(1, SpltTmp, """") = 2 Then
strRec(iDimPos) = ""
Else
strRec(iDimPos) = Mid(SpltTmp,2,Len(SpltTmp)-2)
End If
iDimPos = iDimPos + 1
Else
strRec(iDimPos) = strRec(iDimPos) + SpltTmp
If InStrRev(SpltTmp,"""") = Len(SpltTmp) Then
strRec(iDimPos) = Mid(strRec(iDimPos),2, Len(strRec(iDimPos))-2)
iDimPos = iDimPos + 1
End If
End If
Next
'1番目の項目
colum1 = strRec(0)
'具体的な処理は省略
Loop
objFile.Close