【发布时间】:2019-10-05 01:28:15
【问题描述】:
我有一个带有单个标题行的 CSV。每行的某些列需要映射到一个类,而该行的其他列需要映射到不同的类。
我试过了,但没有成功:
using(var reader = new StreamReader(@"c:\temp\myfile.csv"))
{
using(var csv = new CsvReader(reader))
{
csv.Configuration.RegisterClassMap<ClientMap>();
csv.Configuration.RegisterClassMap<BookingMap>();
var bookings = csv.GetRecords<Booking>();
... //iterate over bookings and write to Console
reader.BaseStream.Position = 0;
var clients = csv.GetRecords<Client>();
... //iterate over clients and write to Console
}
}
类
public class Client {
public string Firstname {get; set;}
public string Lastname {get; set;}
public AgesEnum Age {get; set;}
}
public class Booking {
public string ExternalId {get; set;}
public string Status {get; set;}
}
地图
public class ClientMap : ClassMap<Client>
{
public ClientMap()
{
Map(m => m.Firstname).Name("FIRSTNAM");
Map(m => m.Lastname).Name("LASTNAME");
Map(m => m.Age).ConvertUsing(row =>{
var age = row.GetField<int>("AGE");
if(age < 2)
return AgesEnum.Baby;
if(age < 10)
return AgesEnum.Young;
if(age < 40)
return AgesEnum.Middle;
return AgesEnum.Old;
} );
}
}
public BookingMap : ClassMap<Booking>
{
public BookingMap()
{
Map(b => b.ExternalId).Name("SYSID");
Map(b => b.Status);
}
}
当我运行它时会发生什么,bookings 得到很好的返回,我可以迭代它们。但是,我在GetRecords<Client>() 行收到一个错误,指出
无法执行转换。文本:“年龄”成员类型:TypeConverter:“CsvHelper.TypeConversion.Int32Converter”
如果我注释掉与 Bookings 相关的所有代码并只执行GetRecords<Client>(),我不会收到错误。
为什么这不起作用?我必须设置一个全新的StreamReader吗?
【问题讨论】:
-
您是否有可能在某些时候遗漏了 (int) 演员表?我不确定 CsvHelper 是否可以转换自定义枚举。无论是那个还是您的自定义“AgesEnum”都没有每个可能的字符串的 Int 值。