将RawRecord包含在从CsvHelper GetRecords返回的动态对象中

问题描述 投票:0回答:1

我通过使用Configuration.RegisterClassMap转换为Class对象时,可以进行此工作(本质上是将row.Context.RawRecord映射到我的Class上名为RawRecord的属性上:]

public sealed class RecordMap : ClassMap<CsvRecord>
{
    public RecordMap()
    {
        AutoMap(CultureInfo.CurrentCulture);
        Map(m => m.RawRecord).ConvertUsing(row => row.Context.RawRecord.Replace("\r\n", ""));
    }
}

...但是我想摆脱使用类对象(在此示例中为CsvRecord),而是将动态对象与csv.GetRecords<dynamic>()一起使用。这对我来说是有效的,除了我无法确定如何获得RawRecord。理想情况下,如果我可以添加一些配置以简单地将其添加为动态对象上的新列,但找不到类似的内容。

我正在使用linq来构建域对象(Individuals)列表,其中包括对CSV行进行分组,所以我不想手动遍历每条记录:

using (var csv = new CsvReader(reader, CultureInfo.CurrentCulture))
{
    csv.Configuration.PrepareHeaderForMatch = (string header, int index) => Regex.Replace(header, "[^A-Za-z0-9]", "");

    var dateUpdated = DateTime.UtcNow;
    var individuals = csv.GetRecords<dynamic>().ToList().Where(r => r.GroupType == "Individual").
        GroupBy(r => r.GroupID).
        Select(g => new Individual(
            // Include constructor arguments here
            g.Key,
            g.First().Name1
            // ...
            // Include an array of all raw CSV records that have been used to generate this object
            // This currently fails
            g.Select(r => r.RawRecord).Cast<string>().ToArray()
        )).ToList();
}

csvhelper
1个回答
0
投票
using (var csv = new CsvReader(reader, CultureInfo.CurrentCulture)) { csv.Configuration.PrepareHeaderForMatch = (string header, int index) => Regex.Replace(header, "[^A-Za-z0-9]", ""); csv.Read(); csv.ReadHeader(); var records = new List<dynamic>(); while (csv.Read()) { var record = csv.GetRecord<dynamic>(); record.RawRecord = csv.Context.RawRecord.Replace("\r\n", ""); records.Add(record); } var dateUpdated = DateTime.UtcNow; var individuals = records.Where(r => r.GroupType == "Individual"). GroupBy(r => r.GroupID). Select(g => new Individual( // Include constructor arguments here g.Key, g.First().Name1 // ... // Include an array of all raw CSV records that have been used to generate this object // This currently fails g.Select(r => r.RawRecord).Cast<string>().ToArray() )).ToList(); }
© www.soinside.com 2019 - 2024. All rights reserved.