为什么在使用 FileHelpers 导入 CSV 文件时,我应该将 class 模型的最后一列标记为可选?

Why should I mark the last column of class model as optional when importing a CSV file with FileHelpers?

我在 Whosebug 上阅读了很多问题,试图找到一个简单问题的解决方案。我正在使用 FileHelpers 库导入 CSV 文件。 CSV 文件在最后一列没有分隔符,当我尝试导入时出现错误

Line: 2 Column: 179. Delimiter ',' not found after field 'Active' (the record has less fields, the delimiter is wrong or the next field must be marked as optional)

没错,因为我的文件看起来像

...,Clip Ons,,D02,8 Card Wallet,Y
...,D02,Bathurst Chain Crossbody,Y

我找到的一个解决方案是使用属性 FieldOptional 标记最后一列。问题是该列不是可选的;如果最后一列为空,它必须抛出错误。

如何处理这种情况以避免“FieldOptional”属性?

您使用的是哪个版本?使用 FileHelpers 3.1.5,这工作正常:

[DelimitedRecord(",")]
[IgnoreEmptyLines]
public class MySpec
{
    public string Column1;
    public string Column2;
    public string Column3;
    public string Column4;
    public string Column5;
}

class Program
{
    static void Main(string[] args)
    {
        var fileHelpersEngine = new FileHelperEngine<MySpec>();
        var records = fileHelpersEngine.ReadString("Clip Ons,,D02,8 Card Wallet,Y");
        var firstRecord = records.First();
        Assert.AreEqual("Clip Ons", firstRecord.Column1);
        Assert.AreEqual(string.Empty, firstRecord.Column2);
        Assert.AreEqual("D02", firstRecord.Column3);
        Assert.AreEqual("8 Card Wallet", firstRecord.Column4);
        Assert.AreEqual("Y", firstRecord.Column5);
        Console.ReadKey();
    }
}

对于旧版本(如果我没记错的话是 2.0),您需要再添加一个额外的(虚拟)属性 并将其标记为 [FieldOptional]。这意味着:最后一个分隔符是可选的,我不关心最后一个分隔符后的任何内容

因此您的 class 将如下所示:

[DelimitedRecord(",")]
[IgnoreEmptyLines]
public class MySpec
{
    public string Column1;
    public string Column2;
    public string Column3;
    public string Column4;
    public string Column5;
    [FieldOptional]
    public string Dummy;
}

这个 class 也适用于上面的例子。