【发布时间】:2019-07-30 06:03:29
【问题描述】:
使用 CsvHelper 读取 CSV 文件,您可以在 ClassMap 中指定预期的 Header:
public sealed class readFooMapper : ClassMap<FooCSV>
{
public readFooMapper()
{
Map(m => m.Id).ConvertUsing(row => ((CsvReader)row).Parser.Context.RawRow);
Map(x => x.Foo).Name("Foo");
Map(x => x.Bar).Name("Bar");
Map(x => x.FooBar).Name("FooBar");
Map(x => x.MyOptional).Name("MyOptional").Optional();
}
}
每个映射的属性都是必需的和预期的,可选的用于区分可能存在或可能不存在的属性。
标头由Action<bool, string[], int, ReadingContext> HeaderValidated 验证,具有各自的参数:isValid、headerNames、headerNameIndex、context。
当一个标题不丢失时,isValid 为假。 headerNames 和 'headerNameIndex' 将分别包含标题的预期名称或索引。
我可以用它来知道缺少标题。
如何访问预期标题列表? ReadingContext context 的许多属性将保存当前标题的列表。
我可以使用验证循环将所有 headerNames 和 'headerNameIndex' 添加到列表中。
var errorSb = new StringBuilder();
[...]
csvReader.Configuration.HeaderValidated =
(isValid, headerNames, headerNameIndex, context) =>
{
allHeaderNames.Add(headerNames);
if (!isRowValid)
{
isHeaderInvalid= true;
}
};
我真正想要的是readFooMapper 映射配置。
告诉用户:“看,我期望这个列列表:##、##、##。带有这些可选列:X、Y、Z。\n 缺少列 = A、B、C。”
这无需维护一个另一个列表标题和可选。
【问题讨论】: