尝试使用CsvHelper将CSV行解析为多个类

时间:2019-05-17 17:32:16

标签: c# csvhelper

我有一个带有单个“标题”行的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>()

2 个答案:

答案 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
    }
}