Home > Enterprise >  How to map one class properties to another using class with different names using CsvClassMap
How to map one class properties to another using class with different names using CsvClassMap

Time:01-10

My application reads .CSV file(which do not having a header in csv file) and converts into XML file. For existing code wrote as

sr = new StreamReader(fs);
fs = null;

using (CsvReader csvReader = new CsvReader(sr))
{
    sr = null;

    csvReader.Configuration.HasHeaderRecord = hasHeaderRecord;
    csvReader.Configuration.IgnoreBlankLines = false;
    csvReader.Configuration.IgnoreReadingExceptions = true;
    csvReader.Configuration.WillThrowOnMissingField = false;
    csvReader.Configuration.TrimFields = true;

    csvReader.Configuration.RegisterClassMap<Class1Map>();
    FileRecords = csvReader.GetRecords<Class1>().ToList();
}


public class Class1Map : CsvClassMap<Class1>
    {
        public Class1Map()
        {
            Map(m => m.AccountId).Index(0);
            Map(m => m.MeterId).Index(1);
            .......
            .......
        }
     }

But now for my new requirement, .csv file includes header and column names that are different compared to previous .csv. Somehow I have read the new CSV file and get values present in the csv file and mapped to class1.

Class1 properties are AccountId,MeterId etc. But in new format the names are different now. AccountId as AccountRef and MeterId as MeterSerial.

Can any one suggest how to map new file values of AccountRef,MeterSerial to class1 properties AccountId,MeterId

CodePudding user response:

You could just add .Name() to your maps. Your first example with no header will use .Index() and your second example with a header will use .Name() to map the columns.

void Main()
{
    var config1 = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        HasHeaderRecord = false
    };

    using (var reader = new StringReader("1,2\n3,4"))
    using (var csv = new CsvReader(reader, config1))
    {
        csv.Context.RegisterClassMap<Class1Map>();
        var records = csv.GetRecords<Class1>().Dump();
    }

    var config2 = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        HasHeaderRecord = true
    };

    using (var reader = new StringReader("MeterSerial,AccountRef\n4,5\n6,7"))
    using (var csv = new CsvReader(reader, config2))
    {
        csv.Context.RegisterClassMap<Class1Map>();
        var records = csv.GetRecords<Class1>().Dump();
    }
}

public class Class1Map : ClassMap<Class1>
{
    public Class1Map()
    {
        Map(m => m.AccountId).Index(0).Name("AccountRef");
        Map(m => m.MeterId).Index(1).Name("MeterSerial");
    }
}

public class Class1
{
    public int AccountId { get; set; }
    public int MeterId { get; set; }
}
  • Related