2

CSV ファイルを読み取るには、次のステートメントを使用します。

var query = from line in rawLines
    let data = line.Split(';')
    select new
    {
    col01 = data[0],
    col02 = data[1],
    col03 = data[2]
    };

読み取りたい CSV ファイルの形式が正しくあり;ません。引用符で囲まれていると、エントリにセパレータ自体がデータとして含まれる可能性があります。

例:

col01;col02;col03
data01;"data02;";data03

上記の read ステートメントは、2 行目を 4 列として解釈するため、ここでは機能しません。

質問:この不正な形式の CSV を正しく処理する簡単な方法はありますか? おそらく別のLINQクエリで?

4

3 に答える 3

11

CSVパーサーを使用して、独自のロールを停止するだけです:

using (var parser = new TextFieldParser("test.csv"))
{
    parser.CommentTokens = new string[] { "#" };
    parser.SetDelimiters(new string[] { ";" });
    parser.HasFieldsEnclosedInQuotes = true;

    // Skip over header line.
    parser.ReadLine();

    while (!parser.EndOfData)
    {
        string[] fields = parser.ReadFields();
        Console.WriteLine("{0} {1} {2}", fields[0], fields[1], fields[2]);
    }
}

TextFieldParser.NET に組み込まれています。Microsoft.VisualBasicアセンブリへの参照を追加するだけで、準備完了です。実際の CSV パーサーは、この状況を喜んで処理します。

于 2013-10-28T08:27:08.570 に答える
1

CSV ファイルを手動で解析すると、常にこのような問題が発生する可能性があります。CsvHelperなどのサードパーティ ツールを使用して解析を処理することをお勧めします。

さらに、セパレーターはコンピューターの環境オプションでオーバーライドされる可能性があるため、コンマを明示的に解析することはお勧めできません。

さらにお手伝いできることがあればお知らせください。

マット

于 2013-10-28T08:26:55.247 に答える
0

あまりエレガントではありませんが、メソッドを使用した後、colxx に未完成の引用符 (単一) が含まれているかどうかを確認して、次の colxx と結合できます。

于 2013-10-28T08:22:55.680 に答える