使用Filehelpers处理DelimitedRecord中的NEWLINE

我使用优秀的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  bla bla|2012-03-01 04|Mary|bla bla bla bla|2012-01-01 

请注意,ID为3的行在文本中有换行符。 另请注意,注释不包含引号,因此[FieldQuoted('"', MultilineMode.AllowForRead)]不会保存我。

Filehelpers在第4行抛出exception:

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

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

您必须通过在将第三个字段传递给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(); 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(); } }