如何使用FileHelpers库从csv中只读取一定数量的字段?

时间:2012-08-03 08:46:06

标签: c# csv filehelpers

我手上有一个应用程序,它使用FileHelpers库来处理csv文件。

过去,输入csv文件始终具有相同的结构,5个以逗号分隔的字段用于记录,然后是用于分隔记录的新行。

但是,最近,我开始接收每行有五个以上记录的csv文件,显然,当前用于csv解析的类不适用于这些行。问题是,我仍然只需要前五个字段,它们仍以相同的顺序提供。

有没有办法用FileHelpers读取前五个字段,并在换行前忽略任何其他数据?

目前用于解析的类:

[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;
}

3 个答案:

答案 0 :(得分:4)

使用FileHelper,您可以将此变量添加为最后一个:

public string[] FunkyNewField;

如果您已定义FieldOrder,请按以下方式添加:

[FieldOrder(n)]
public string[] FunkyNewField;

其中n =最后指定订单号后的数字。

这将包含您不想使用的文件中的所有额外列。

答案 1 :(得分: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
    }
}

答案 2 :(得分: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;
}