【发布时间】:2018-08-24 14:22:25
【问题描述】:
在解析错误时获取整个 Csv 行
对于CsvHelper,我们使用:
MissingFieldFound:获取或设置找到缺失字段时调用的函数。默认 函数将抛出 CsvHelper.MissingFieldException。您可以提供自己的 函数来做其他事情,比如记录问题而不是抛出异常。 参数:headerNames、index、context
BadDataFound:获取或设置在发现错误字段数据时调用的函数。一个领域 如果它包含引号并且该字段未引用(转义),则具有错误数据。你 可以提供您自己的功能来执行其他操作,例如记录问题 抛出异常。参数:上下文
在下面的 MCVE 中,只有 MissingFieldFound 捕获完整行,而 BadDataFound 没有。
static void Main()
{
using (var stream = new MemoryStream())
using (var writer = new StreamWriter(stream))
using (var reader = new StreamReader(stream))
using (var csv = new CsvReader(reader))
{
writer.WriteLine("FirstName,LastName");
writer.WriteLine("\"Jon\"hn\"\",\"Doe\"");
writer.WriteLine("\"JaneDoe\"");
writer.WriteLine("\"Jane\",\"Doe\"");
writer.Flush();
stream.Position = 0;
var good = new List<Test>();
var bad = new List<string>();
var isRecordBad = false;
csv.Configuration.BadDataFound = context =>
{
isRecordBad = true;
bad.Add(context.RawRecord);
};
csv.Configuration.MissingFieldFound = (headerNames, index, context) =>
{
isRecordBad = true;
bad.Add(context.RawRecord);
};
while (csv.Read())
{
var record = csv.GetRecord<Test>();
if (!isRecordBad)
{
good.Add(record);
}
isRecordBad = false;
}
good.Dump();
bad.Dump();
}
}
public class Test
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
我希望结果是:
"乔恩""","Doe"
“简多”
而不是:
"乔恩""", “简多”
对于包含大量列的长 Csv,该行的其余部分通常包含有价值的信息。
【问题讨论】:
-
Hacky,但您可以将
StreamReader包装在您自己的TextReader实现中,因此您可以保留CsvReader读取的最后一行。假设它需要一个TextReader,那就是 - 我从未使用过 csvhelper。 -
您为什么不将您想要的更改贡献给 CsvHelper GitHub:github.com/JoshClose/CsvHelper?
-
@C.Evenhuis,是的
CsvReader采取TextReader:CsvReader(TextReader reader)。但即使我有点害怕“自己的TextReader实现”周末在几个小时后我可以读一两本书。你有没有可以在这个过程中帮助我的文档/书籍。 -
@Polyfun,我希望有人能指出我在上下文或流中错过的属性,读者部分。我只需要从 byte[] 转换,瞧。大多数时候都是这样。
-
@xdtTransform 这个博客已经记录了当前/最后一行:blogs.msdn.microsoft.com/jmstall/2005/08/06/…