.net FileHelpers和CSV:当记录可以无限水平扩展时该怎么办

.net FileHelpers和CSV:当记录可以无限水平扩展时该怎么办,.net,csv,filehelpers,.net,Csv,Filehelpers,我正在尝试使用FileHelpers解析这种类型的CSV文件: Tom,1,2,3,4,5,6,7,8,9,10 Steve,1,2,3 Bob,1,2,3,4,5,6 Cthulhu,1,2,3,4,5 Greg,1,2,3,4,5,6,7,8,9,10,11,12,13,14 我不知道如何用FileHelpers解析这个。我想我应该可以做这样的事情: [DelimitedRecord(",")] public class MyRecord { public string Name;

我正在尝试使用FileHelpers解析这种类型的CSV文件:

Tom,1,2,3,4,5,6,7,8,9,10
Steve,1,2,3
Bob,1,2,3,4,5,6
Cthulhu,1,2,3,4,5
Greg,1,2,3,4,5,6,7,8,9,10,11,12,13,14
我不知道如何用FileHelpers解析这个。我想我应该可以做这样的事情:

[DelimitedRecord(",")]
public class MyRecord
{
    public string Name;

    public List<int> Values;
}
然后,我需要在逗号上拆分
,以获得每个记录的值集。如果我必须手动解析每条记录的一部分,那么使用FileHelper似乎没有多大意义


我错过什么了吗?我浏览了文档/示例,但似乎找不到适合我的格式的解决方案。Excel对我的格式没有问题,所以我想有一种方法可以用现有的免费库(FileHelpers或其他库)来实现。有什么想法吗?

您可以创建一个类
MyRecord
,它保存所有潜在的值,例如

[DelimitedRecord(",")]
public class MyRecord
{
    public string Name;
    public int Value1;
    .....
    [FieldOptional]
    public int Value5;
    ......
    [FieldOptional]
    [FieldNullValue(typeof(int), "-1" )]
    public int Value14;
}
并将大多数字段设置为可选字段(在我的示例中为5到14),并将其与例如
FieldNullValue
组合以处理那些不存在的字段(或将这些可选字段设置为可为空的int:

 public int? Value5

您可以使用数组字段,库将完成以下工作:

[DelimitedRecord(",")]
public class MyRecord
{
    public string Name;

    public int[] Values;
}
您甚至可以使用[FieldArrayLength(2,8)]

设置值的最小/最大数量

我强烈建议从这里下载库的最新版本:


检查工件部分

是的,我在考虑这个问题,但这样做感觉很奇怪。我怀疑我的数据会扩展到50多列,但我不希望有人尝试使用我的代码,将其扩展到51列,而我只有前50列的选项字段…:-/@unforgiven3:是的,你完全正确。看到另一个了吗FileHelpers作者的回答-如果有人知道,他知道:-)这是一个鲜为人知的功能,您是对的,我们需要将它们添加到文档和示例中,欢迎对此功能的任何建议,最好是RegardsOk-但是,如果值是字符串数组呢?如果我尝试这样做,我会收到以下错误消息:“类型为:String[]的字段:'Values'是非系统类型,因此此字段需要CustomConverter(有关更多信息,请参阅文档)。”我只是用上一个版本检查它,它非常适合字符串,你能给我发送或在这里发布记录类代码吗值…其他所有内容都是相同的。我引用的是FileHelpers.dll v2.0.0.0。非常干净的解决方案Marcos!我想知道它是否可以扩展到处理位于分隔记录中的名称-值对?我见过类似“日期、类型、名称、值、名称、名称、值、值、名称、值”的示例,其中这些对需要在一个数组中结束。诚然,更干净的方法是这是主-细节方式,但仅限于我们可以控制模式的地方。
[DelimitedRecord(",")]
public class MyRecord
{
    public string Name;

    public int[] Values;
}
[DelimitedRecord(",")]
public class MyRecord
{
    public string Name;

    [FieldArrayLength(2, 8)]
    public int[] Values;
}