3

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

过去,输入的 csv 文件总是具有相同的结构,一个记录有 5 个逗号分隔的字段,然后是一个新行来分隔记录。

然而,最近,我开始收到每行超过 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;
}
4

3 回答 3

5

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

public string[] FunkyNewField;

如果你定义了 FieldOrder 然后像这样添加它:

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

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

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

于 2015-03-26T15:11:14.080 回答
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 回答
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 回答