我正在使用优秀的 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 的行在文本中有一个换行符。还要注意注释没有被引号包围,所以
[FieldQuoted('"', MultilineMode.AllowForRead)]
不会拯救我。Filehelpers 在第 4 行抛出异常:
无论如何我可以用 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<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();
}
}
关于c# - 使用 Filehelpers 处理 DelimitedRecord 中的 NEWLINE,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11511192/