【问题标题】:How do I read only a set number of fields from a csv using the FileHelpers library?如何使用 FileHelpers 库从 csv 中仅读取一组字段?
【发布时间】:2015-03-26 23:11:14
【问题描述】:

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

【问题讨论】:

    标签: c# csv filehelpers


    【解决方案1】:

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

    public string[] FunkyNewField;
    

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

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

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

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

    【讨论】:

    • 这解决了忽略不需要的列(任何数字)。我通过反复试验尝试使用 List 并感到恼火:) 感谢分享。
    【解决方案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
        }
    }
    

    【讨论】:

    • 感谢您的建议,Fast CSV Reader 工作正常。我只是不愿意抛弃 FileHelpers,因为该代码早在我之前就已经存在了。
    【解决方案3】:

    一个简单的解决方案是添加一些私有虚拟字段(作为可选)来获取值

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

    【讨论】:

    • 绝招!似乎在任何地方都没有记录,但我看到其他人也提到了这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 2022-01-07
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    相关资源
    最近更新 更多