3

FileHelpersライブラリを使用してcsvファイルを処理するアプリケーションを手にしています。

以前は、入力csvファイルは常に同じ構造で、レコードに対して5つのコンマ区切りフィールドがあり、レコードを区切るための新しい行がありました。

しかし、最近、1行に5レコードを超えるcsvファイルを受信し始めました。明らかに、現在csv解析に使用されているクラスはこれらの行には適用されません。問題は、最初の5つのフィールドだけが必要であり、それらは同じ順序で提供されているということです。

FileHelpersで最初の5つのフィールドを読み取り、改行まで他のデータを無視する方法はありますか?

現在解析に使用されているクラス:

[IgnoreEmptyLines()]
[DelimitedRecord(";")]
public sealed class SemicolonsRow
{
    [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
    public String LastName;

    [FieldOptional()]
    [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
    public String Name;

    [FieldOptional()]
    [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
    public String MidName;

    [FieldOptional()]
    [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
    public String BirthDate;

    [FieldOptional()]
    [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
    public String BirthPlace;
}
4

3 に答える 3

2

簡単な解決策は、値を取得するいくつかのプライベートダミーフィールドを(オプションとして)追加することです。

[IgnoreEmptyLines()]
[DelimitedRecord(";")]
public sealed class SemicolonsRow
{
    [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
    public String LastName;

    [FieldOptional()]
    [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
    public String Name;

    [FieldOptional()]
    [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
    public String MidName;

    [FieldOptional()]
    [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
    public String BirthDate;

    [FieldOptional()]
    [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
    private String DummyField1;

    [FieldOptional()]
    [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
    private String DummyField2;

    [FieldOptional()]
    [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
    private String DummyField3;

    [FieldOptional()]
    [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
    private String DummyField4;

    [FieldOptional()]
    [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
    private String DummyField5;
}
于 2012-08-03T18:36:20.733 に答える
2

列の数が問題を引き起こしているという事実は、設計が間違っていることを示唆しています。

最近、「A Fast CSV Reader」を使用して CSV の解析を行ったところ、非常にうまく機能しました。単純なループで列にインデックスforを付けることができるため、最初の 5 列のみが必要な場合は、次のようにすることができます。

CsvReader csv = new CsvReader(new StreamReader(fileName), true);

// Iterating LINES
while (csv.ReadNextRecord())
{
    // Iterating COLUMNS on current line
    for (int i = 0; i < 5; i++)
    {
        string value = csv[i];
        // do stuff with value
    }
}
于 2012-08-03T09:15:34.190 に答える