我手上有一个应用程序,它使用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;
}
答案 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;
}