asp.net 如何使用CsvClassMap将一个类属性Map到另一个使用不同名称的类

56lgkhnf  于 2023-01-10  发布在  .NET
关注(0)|答案(1)|浏览(129)

我的应用程序读取.CSV文件(其中没有标头的csv文件)并转换为XML文件。对于现有的代码写为

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);
            .......
            .......
        }
     }

但现在对于我的新要求,.csv文件包含与以前的. csv文件不同的标题和列名称。不知何故,我读取了新的CSV文件,并获得了csv文件中存在的值,并Map到class1。
Class1属性为AccountId、MeterId等。但在新格式中,名称现在不同。AccountId为AccountRef,MeterId为MeterSerial。
有人能建议如何将AccountRef、MeterSerial的新文件值Map到class1属性AccountId、MeterId吗

4xrmg8kj

4xrmg8kj1#

你可以只把.Name()添加到你的Map中,你的第一个没有标题的例子将使用.Index(),你的第二个有标题的例子将使用.Name()来Map列。

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; }
}

相关问题