【问题标题】:Handling NEWLINE in DelimitedRecord with Filehelpers使用 Filehelpers 处理 DelimitedRecord 中的 NEWLINE
【发布时间】:2012-07-15 16:58:07
【问题描述】:

我正在使用出色的 FileHelpers 库来解析许多不同的文件。其中一个文件的(一些)行看起来像这样

id|name|comments|date
01|edov|bla bla bla bla|2012-01-01
02|john|bla bla bla bla|2012-01-02
03|Pete|bla bla <NEWLINE>
bla bla|2012-03-01
04|Mary|bla bla bla bla|2012-01-01

请注意,id 为 3 的行在文本中有一个换行符。另请注意,cmets 没有被引号包围,因此 [FieldQuoted('"', MultilineMode.AllowForRead)] 不会救我。

Filehelpers 在第 4 行抛出异常:

分隔符“|”在字段“cmets”后找不到(记录少 字段,分隔符错误或下一个字段必须标记为 可选)。

无论如何我可以用 FileHelpers 解析这个文件吗?

【问题讨论】:

    标签: c# parsing csv newline filehelpers


    【解决方案1】:

    您必须通过在第三个字段中添加引号来更正输入,然后再将其传递给 FileHelpers 引擎。如以下程序所示,使用 LINQ 很容易做到。

    [DelimitedRecord("|")]
    [IgnoreFirst(1)]
    public class ImportRecord
    {
        public string Id;
        public string Name;
        [FieldQuoted(QuoteMode.AlwaysQuoted, MultilineMode.AllowForRead)]
        public string Comments;
        public string Date;
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            var engine = new FileHelperEngine<ImportRecord>();
    
            string input = "id|name|comments|date" + Environment.NewLine +
                                  "01|edov|bla bla bla bla|2012-01-01" + Environment.NewLine +
                                  "02|john|bla bla bla bla|2012-01-02" + Environment.NewLine +
                                  "03|Pete|bla bla" + Environment.NewLine +
                                  "bla bla|2012-03-01" + Environment.NewLine +
                                  "04|Mary|bla bla bla bla|2012-01-01";
    
            // Modify import to add quotes to multiline fields
            var inputSplitAtSeparator = input.Split('|');
            // Add quotes around the field after every third '|'
            var inputWithQuotesAroundCommentsField = inputSplitAtSeparator.Select((x, i) => (i % 3 == 2) ? "\"" + x + "\"" : x);
            var inputJoinedBackTogether = String.Join("|", inputWithQuotesAroundCommentsField);
    
            ImportRecord[] validRecords = engine.ReadString(inputJoinedBackTogether);
    
            // Check the third record
            Assert.AreEqual("03", validRecords[2].Id);
            Assert.AreEqual("Pete", validRecords[2].Name);
            Assert.AreEqual("bla bla" + Environment.NewLine + "bla bla", validRecords[2].Comments);
            Assert.AreEqual("2012-03-01", validRecords[2].Date);
    
            Console.WriteLine("All assertions passed");
            Console.ReadKey();
        }
    }
    

    【讨论】:

    • 谢谢,有趣的解决方案
    • 不幸的是,这并不能解决具有多个记录的整个文件的问题...
    • @Jan,当然可以...示例代码验证第三条记录validRecords[2]
    • @shamp00,对不起,你是对的。我应该更仔细地查看您的代码示例:)
    猜你喜欢
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 2017-10-27
    • 2014-02-04
    • 2020-10-28
    相关资源
    最近更新 更多