ADOでCSVファイルを読み込むと255文字以上でエラーになる

 ちょっと前に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

自分が使わなきゃ、誰かに使ってもらえない

 先月、新居に引っ越したところ、備え付けのガス操作パネルに昨日と今日のガス代が表示される機能が付いていました。入居時にガス開栓に来てくれた係員曰く、一定の計算方法に基づいて表示している金額なので、実際のガス代とは違うとの事。
 使用状況を管理して、請求されるガス代と見比べられればガス代を節約出来ると思い、毎日のガス代を記録していく事にしました。
 で、どう記録しようと、ふと数年前に作ったAndriodアプリを思い出しました。

 ガス代の入力項目を設定して、

 こんな感じで毎日登録していきます。

 たまに登録忘れてますけど。。


 このアプリは、筆者が前職を辞めた後に、プログラミングのリハビリを兼ねて、JavaでAndroidアプリを作ったものですが、5年くらい経ってもまだ、ダウンロードは100レベル。。完全ほったらかしなんで、そんなもんでしょうし、どちらかというと仕事利用がターゲットで、利用者が自分でデータ項目を決めるというコンセプト自体がそもそも理解しにくいでしょうね。UIもAndroid2.X時代のままですし。。

 作ろうと思った経緯自体は、ビル管理の仕事をしている人から、計器類の記録を取るツールが欲しいなあという話を聞いたのがきっかけですが、コンセプトとしたのは

 ・汎用的なデータフォーマットに対応
 ・オフラインでも記録が可能
 ・記録したデータは他システムと連携可能
 という3点でした。

 最初の汎用的なデータフォーマットという所で、偶々見つけてくれた人でさえ、データを定義して設定しないと何もできないという難しさがあったと思います。
 2点目は、スマフォアプリなら出来て当たり前ですが。。
 3点目は、スマフォ内部でのデータ保存はあくまで一時的なもので、DBサーバとかに連携出来るよう、結果的にメール送信として実装しています。メールをインターフェース手段としておけば受信側で何か用意すればどうにでも取り込めるだろうと、SMTPの設定をすれば、送信ボタン一発で送れます。
入力画面から1件単位で送信するのと、例えば1か月とか貯めて一覧画面からCSVで送信するのと2パターンを用意しました。今回のガス代は後者を使ってあとでエクセルとかで確認する予定です。
完全フリーですが、この連携箇所に何等かのニーズがあればユーザー開拓が出来るかなあという目論見もありましたが、何も無かったですね。。

 コンセプトうんぬん以前に、作ったアプリを自分自身が使う機会が無かったという事が、ほったらかしにしてしまったようです。
 作った人が使わないものを他の誰かに使ってもらえるという事は期待しちゃいけないですね。5年くらいの時を経て改めて使ってみましたが、暫く使い続けて問題と感じたところを改良してみようと思います。