在 CsvHelper 中处理错误的 CSV 记录
Handling bad CSV records in CsvHelper
我希望能够遍历 CSV 文件中的所有记录,并将所有好的记录添加到一个集合中,并分别处理所有 "bad" 个记录。我似乎无法做到这一点,我想我一定是遗漏了什么。
如果我尝试捕获 BadDataException,则后续读取将失败,这意味着我无法继续读取文件的其余部分 -
while (true)
{
try
{
if (!reader.Read())
break;
var record = reader.GetRecord<Record>();
goodList.Add(record);
}
catch (BadDataException ex)
{
// Exception is caught but I won't be able to read further rows in file
// (all further reader.Read() result in same exception thrown)
Console.WriteLine(ex.Message);
}
}
讨论的另一个选项是设置 BadDataFound 回调操作来处理它 -
reader.Configuration.BadDataFound = x =>
{
Console.WriteLine($"Bad data: <{x.RawRecord}>");
};
然而,尽管调用了回调,但错误记录仍然在我的 "good list"
中结束
在将记录添加到我的列表之前,有什么方法可以查询 reader 以查看记录是否正确?
对于这个例子,我的 Record 定义是 -
class Record
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
}
和数据(第一行坏,第二行好)-
"Jo"hn","Doe",43
"Jane","Doe",21
有趣的是,使用 MissingFieldException 处理缺失的字段似乎完全按照我的意愿运行 - 异常被抛出,但后续行仍然读取正常。
这是我提供的example。
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("\"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);
};
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; }
}
我希望能够遍历 CSV 文件中的所有记录,并将所有好的记录添加到一个集合中,并分别处理所有 "bad" 个记录。我似乎无法做到这一点,我想我一定是遗漏了什么。
如果我尝试捕获 BadDataException,则后续读取将失败,这意味着我无法继续读取文件的其余部分 -
while (true)
{
try
{
if (!reader.Read())
break;
var record = reader.GetRecord<Record>();
goodList.Add(record);
}
catch (BadDataException ex)
{
// Exception is caught but I won't be able to read further rows in file
// (all further reader.Read() result in same exception thrown)
Console.WriteLine(ex.Message);
}
}
讨论的另一个选项是设置 BadDataFound 回调操作来处理它 -
reader.Configuration.BadDataFound = x =>
{
Console.WriteLine($"Bad data: <{x.RawRecord}>");
};
然而,尽管调用了回调,但错误记录仍然在我的 "good list"
中结束在将记录添加到我的列表之前,有什么方法可以查询 reader 以查看记录是否正确?
对于这个例子,我的 Record 定义是 -
class Record
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
}
和数据(第一行坏,第二行好)-
"Jo"hn","Doe",43
"Jane","Doe",21
有趣的是,使用 MissingFieldException 处理缺失的字段似乎完全按照我的意愿运行 - 异常被抛出,但后续行仍然读取正常。
这是我提供的example。
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("\"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);
};
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; }
}