2012-07-16 20 views
3

正在使用优秀的FileHelpers库来解析许多不同的文件。其中一个文件具有(某些)行,看起来像这样使用Filehelpers处理带DelimitedRecord的NEWLINE

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的行在文本中有一个换行符。还请注意评论不包含引号,所以[FieldQuoted('"', MultilineMode.AllowForRead)]不会救我。

Filehelpers第4行抛出异常:

定界符 '|'字段'注释'后未找到(该记录的字段数较少,分隔符错误或下一个字段必须标记为 可选)。

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

回答

3

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

谢谢,有趣的解决方案 – edosoft 2012-12-03 16:12:27

+0

遗憾的是不解决问题的一个以上的记录...... – Jan 2014-05-22 10:20:20

+0

@Jan,当然它整个文件...示例代码验证的第三个记录'validRecords [2]'。 – shamp00 2014-05-22 11:38:10