ちょっと前にVBScriptで作られたツールがあるのですが、最近になってエラーが出るとの連絡。
エラーになるケースは、CSVファイルを読み込んで255Byteを超えている値を扱う時と判明。
対象のツールは実装上ADOが使われており、下記のようにCSVへアクセスしてます。
1 2 3 4 5 6 7 8 9 10 |
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レコード毎に配列へ列の値をセットしてから処理を行っていきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
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 |