- 題名: FileIO.TextFieldParserでCSV読込時エラーになる
- 日時: 2012/10/15 17:13:03
- ID: 31030
- この記事の返信元:
- (なし)
- この記事への返信:
- [31034] Re[1]: FileIO.TextFieldParserでCSV読込時エラーになる2012/10/15 20:44:51
- ツリーを表示
■No31030に返信(kane123さんの記事) > aaa, b, ccc 「aaa,b,ccc」ではなく、 「aaa, b, ccc」なのですね。 parser.TrimWhiteSpace は True での運用でしょうか? > aaa,"b", ccc ・・・エラー箇所 何と言うエラーが発生していますか? 同じデータにしたつもりでしたが、当方ではエラーが再現しませんでした。 検証環境は .NET 4 (WOW64) です。 試しに、データを修正して -------------- A列, B列, C列 aaa,"b",ccc aaa,"b,ccc aaa,b",ccc aaa,b"c"d,efg -------------- としてみましたが、やはりエラーにはなりませんでした。 (最終行の末尾に、改行を付けた場合も付けなかった場合も同様) なお、上記のファイルからは下記の配列が得られました。 「A列」「B列」「C列」 「aaa」「b」「ccc」 「aaa」「b,ccc(改行)aaa,b」「ccc」 「aaa」「b"c"d」「efg」 そして、HasFieldsEnclosedInQuotes = False の場合はこうなりました。 「A列」「B列」「C列」 「aaa」「"b"」「ccc」 「aaa」「"b」「ccc」 「aaa」「b"」「ccc」 「aaa」「b"c"d」「efg」 > このエラーは、CSV内に ," が含まれる場合に、その行への読み込みがおこなわ 「 ,"」ですか?(全角スペース2つ+半角カンマ1つ+ダブルクォーテーション) 先のサンプルデータには、「 」や「,"」はありましたが、 「 ,"」というデータは見当たらないようです。 > また、 ,d"e"f などとなっている場合は発生しません。 > つまり , と " が行内に連続する場合にのみ発生するようです。 「aaa,"b,"ccc」のようなデータになっているわけでは無いのですよね? > こちらでやると各CSVに対し個別に列定義のパラメータファイルを作成しないと、 > 読込間違い(例えば10億以上の数値が勝手に0に変換されるなどの現象)が起こるため、 Microsoft Text Driver バージョン 6.01.7601.17632 での ODBC 接続の他、 JET 4.0 や ACE 12.0 の Text I-ISAM を OleDb 接続で試してみましたが、 10億以上が 0 変換されるパターンは再現できませんでした。 > 列定義のパラメータファイルを作成しないと、 Schema.ini を使わないパターンとしては、ImportMixedTypes 指定で MajorityType ではなく、Text を指定しておくという手法がありますが、 それが「10億以上の数値が0になる」現象の解決になるかどうかは分かりません。 http://hanatyan.sakura.ne.jp/vb60bbs/wforum.cgi?mode=allread&no=15003&page=0 > FileIO.TextFieldParserに全面的に切り替えて処理を行おうという方向性です。 どうしても駄目なら、自前で切り出して処理するとか。
■No31039に返信(kane123さんの記事) > 本番環境にて、再現性のあるCSVの作成に成功しました。 > 以下の文字列です。 下記のコードで読み取りましたが、エラーなく読み込めました。 .NET バージョンの違いでしょうか。 Using parser As New FileIO.TextFieldParser(csvPath, System.Text.Encoding.GetEncoding("Shift_JIS")) parser.TextFieldType = FileIO.FieldType.Delimited parser.TrimWhiteSpace = False parser.HasFieldsEnclosedInQuotes = False parser.SetDelimiters(",") Do Until parser.EndOfData Dim row() As String = parser.ReadFields() Dim line As String = Join(row, "|").Replace(vbCr, "{Cr}").Replace(vbLf, "{Lf}").Replace(vbTab, "{tab}") Console.WriteLine("[" & line & "]") End While parser.Close() End Using TextFieldParser を使うかどうかは別として、CSV の内容を読み解くと: > COL1,COL2,COL3,COL4,COL5,COL6,COL7,COL8,COL9,COL10,COL11 > hoge,12456789,01,0003,,,0003,001,hoge,"HOGE", 引用符をデータの区切りとする場合は 「hoge」「12456789」「01」「0003」「」「」「0003」「001」「hoge」「HOGE」「 」 と解釈できますね。引用符もデータの一部と見なす場合はこうなるでしょう。 「hoge」「12456789」「01」「0003」「」「」「0003」「001」「hoge」「"HOGE"」「 」 > COL1,COL2,COL3,COL4,COL5,COL6,COL7,COL8,COL9,COL10,COL11 > hoge,12456789,01,0003,,,0003,001,hoge,"HOGE, 引用符をデータの区切りとする場合、引用符が奇数個なのでエラーになって欲しいところ。 引用符もデータの一部と見なす場合は、こうかな。 「hoge」「12456789」「01」「0003」「」「」「0003」「001」「hoge」「"HOGE」「 」 > COL1,COL2,COL3,COL4,COL5,COL6,COL7,COL8,COL9,COL10,COL11 > hoge,123456789,01,0003,,,0003,001,hoge,"HOGE" hoge, 引用符をデータの区切りとする場合はエラーもしくは警告。 引用符もデータの一部と見なす場合はこんな感じで。 「hoge」「12456789」「01」「0003」「」「」「0003」「001」「hoge」「"HOGE" hoge」「 」
分類:[.NET]
いつもお世話になっております。
CSVの読み込み時における、あるエラーについて質問いたします。
以下のCSVに対し、以下のVB.netのコードを実行すると、
「エラー箇所」の所でエラーが発生します。
A列, B列, C列
aaa, b, ccc
aaa, b, ccc
aaa, b, ccc
aaa, b, ccc
aaa,"b", ccc ・・・エラー箇所
aaa, b, ccc
Dim parser as New FileIO.TextFieldParser("C:\MYCSV.csv",system.Text.Encoding.GetEncoding("Shift_JIS"))
parser.TextFieldType = FileIO.FieldType.Delimited
parser.SetDelimiters(",")
While Not parser.EndOfData
Dim row As String() = parser.ReadFields() '5行目でエラー
'処理
End While
このエラーは、CSV内に ," が含まれる場合に、その行への読み込みがおこなわ
れる時に発生します。また、 ,d"e"f などとなっている場合は発生しません。つまり , と " が
行内に連続する場合にのみ発生するようです。
この現象を回避する方法は無いでしょうか?
ちなみに以前はCSVの読込をSystem.Data.Odbc.OdbcConnection で行っていましたが、
こちらでやると各CSVに対し個別に列定義のパラメータファイルを作成しないと、
読込間違い(例えば10億以上の数値が勝手に0に変換されるなどの現象)が起こるため、
FileIO.TextFieldParserに全面的に切り替えて処理を行おうという方向性です。
宜しくお願いいたします。