0

3 つのフィールドを持つ csv ファイルを渡そうとしています。最初の 2 つのフィールドは単純で、簡単に抽出できます。問題は、3 番目のフィールドが本質的に文字列であるため、フィールドを区切るために使用される「,」などの特殊文字を含めることができることです。2 つの ' " ' (二重引用符) の間に文字列フィールドを含めてみました。しかし、私の要件は、単純な文字列 (特殊文字なし) の場合、二重引用符なしで存在できることです。文字列の次の行も処理する必要があります。以下はcsv ファイルのサンプル。

123,本当,これはメモです

234,false,"これもメモです"

345、真、

456,真,上は白紙メモ

567,false,"これには、

初期化"

678,true,これには , が含まれています <--- このレコードは拒否する必要があります

789、偽、""

890,true,アバブも有効な白紙メモ

http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashxで、正規表現形式の文字列をテストするための優れたツールも見つけました。

これまで、次のフォーマット文字列 ^(""(?:[^""]|"""") ""|[^,] ),(""(?:[^""]|""を使用してきました"") ""|[^,] )$

このフォーマット文字列の問題は、複数行を処理できず、開始二重引用符で終了二重引用符が欠落している文字列を拒否しないことです。

前もって感謝します。


助けてくれてありがとう。CSV のカスタム データを解析する必要があり、独自のカスタム パーサーを作成する必要がありました。すべてのフィールドを個別に解析し、正規表現文字列を小さなチャンクで使用しています。

4

1 に答える 1

4

この車輪を再び発明する必要はありません。既存の CSV パーサーを使用することをお勧めしますが、優れた代替手段がたくさんあります。

私はCSVReaderで大きな成功を収めました。非常に高速で使いやすいです。基本的な使い方:

using (CsvReader csv = new CsvReader(new StreamReader("data.csv"), true))
{
    int fieldCount = csv.FieldCount;
    string[] headers = csv.GetFieldHeaders();

    while (csv.ReadNextRecord())
    {
        for (int i = 0; i < fieldCount; i++)
            Console.Write(string.Format("{0} = {1};", headers[i], csv[i]));

        Console.WriteLine();
    }
}
于 2012-08-30T05:50:41.373 に答える