我通过使用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();
}
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();
}