我有一个带有单个“标题”行的CSV。每行的某些列需要映射到一个类,而该行的其他列则需要映射到另一个类。
我尝试过但没有成功:
private Singleton () {
}
public static Singleton() {
return new Singleton();
}
课程
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
行上看到一条错误消息,指出
无法执行转换。文本:“年龄”成员类型:TypeConverter:“ CsvHelper.TypeConversion.Int32Converter”
如果我注释掉与预订有关的所有代码,并且仅执行GetRecords<Client>()
,则不会出错。
为什么不起作用?我是否需要设置一个全新的GetRecords<Client>()
?
答案 0 :(得分:0)
我认为您可能会发现将Cnums与CsvHelper right here一起使用的有趣之处
答案 1 :(得分:0)
问题是您将流位置重新设置为开头,CsvReader
认为您在预订时已经读取了标头,因此它再次读取第一行作为数据而不是标头。您需要再次手动阅读标题。
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;
csv.Read();
csv.ReadHeader();
var clients = csv.GetRecords<Client>();
... //iterate over clients and write to Console
}
}