4

次のコードを使用して、csv ファイルからデータを取得しています。

    public DataTable GetCSVData(string CSVFileName)
    {
        string CSVConnectionString = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" + ConfigurationSettings.AppSettings["CSVFolder"].ToString() + ";Extensions=asc,csv,tab,txt;Persist Security Info=False;";

        using (OdbcConnection Connection = new OdbcConnection(CSVConnectionString))
        {
            DataTable CSVDataTable = new DataTable();

            string SelectQuery = string.Format(@"SELECT * FROM [{0}]", CSVFileName);

            OdbcDataAdapter Adapter = new OdbcDataAdapter(SelectQuery, Connection);

            Adapter.Fill(CSVDataTable);

            return CSVDataTable;
        }
    }

正確な問題は、下の行 1 に示すように、csv 列に太字で強調表示されているデータが含まれている場合です。

Row1-> col1、「cdwdf」dsdfs、col2、col3

上記のコードを使用してデータをフェッチしている間、col2 と col3 (強調表示されたテキストの後の列) はスキップされ、次の行からデータをフェッチし続けます。

行 1 の前述の列テキストが完全に引用符で囲まれている場合 ( "cdwdf dsdfs" )、データは正しくフェッチされます。

このような状況でcsvからデータを取得する方法を誰か教えてください...

4

2 に答える 2

2

二重引用符はcsv 仕様の一部です。二重引用符を含むデータがある場合は、フィールド (または列) 全体を二重引用符で囲み、フィールド内の二重引用符を二重引用符でエスケープする必要があります。

したがって、行は次のようになります。

Row1-> col1,"""cdwdf"" dsdfs",col2,col3

私は CSV ライブラリを使用したことがないので、お勧めできませんが、自分でファイルを簡単に解析できます。ファイルを 1 行ずつ読み取り、「,」で分割するだけです。これに関する問題は、複数の行にまたがるフィールドです....

編集:要約すると、CSV入力ファイルを変更するか、より寛容なパーサーを見つけるか、不正な形式のCSVレコードが見つかったときに少なくとも例外をスローするパーサーを見つける必要があります。一見すると、他の人が提案したFAST CSV リーダーは、不正な形式の CSV が意味のある例外で失敗する原因になると主張しているため、開始するのに適しているように思えます。

于 2011-06-08T12:38:30.630 に答える
2

Fast CSV Readerは非常に高速で、csv ファイル構造の識別に優れているため、私はFast CSV Readerを使用します。

于 2011-06-08T12:26:40.293 に答える