c# - 在错误解析或读取时获取整个 CSV 行
问题描述
在解析错误时获取整个 Csv 行
使用CsvHelper我们使用:
MissingFieldFound
:获取或设置在找到缺失字段时调用的函数。默认函数将引发 CsvHelper.MissingFieldException。您可以提供自己的函数来执行其他操作,例如记录问题而不是引发异常。参数:headerNames、索引、上下文
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”
“JaneDoe”
代替 :
“乔恩”、“简多”
对于具有大量列的长 Csv,该行的其余部分通常具有有价值的信息。
解决方案
你可以得到这条线:
csv.Parser.Context.RawRecord;
推荐阅读
- node.js - Nodejs:Ioredis 对哈希数据进行排序
- azure-devops - 获取我所有的功能 + 来自所有的故事以及我所有与其他功能相关的故事
- java - SPRING BOOT-KOTLIN:将自定义 java 类导入 (Kotlin) 控制器会引发 java.lang.NoClassDefFoundError
- java - 在Java中的不同线程中读取多个文本文件
- c - 用 C 语言编写程序,使用函数显示偶数和奇数自然数的 n 项及其和
- android - 当我在当前活动片段中刷新时,Jetpack Paging 3 RemoteMediator 正在为其他片段调用 LoadType.APPEND
- azure - Azure WebApp 防火墙的 Powershell 脚本
- javascript - 如何从特定字符中删除部分字符串?
- couchbase - Couchbase 删除的文档重新出现在数据库中
- javascript - 使用 javascript 检索计算的 svg 颜色