CsvHelper – 将多列读入单个列表

我正在使用CSVHelper读取大量数据

我想知道是否可以读取最后n列并将它们转换为列表

 "Name","LastName","Attribute1","Attribute2","Attribute3" 

并将数据塑造成这样的东西

 public class Person { public string FirstName { get; set; } public string LastName { get; set; } public IList Attributes { get; set; } } 

我希望一步到位,我确信我可以有一个中间步骤,我放入一个具有匹配属性属性的对象但是在一个人上做它会很好

这可以作为映射器。

 public sealed class PersonMap : CsvClassMap { private List attributeColumns = new List { "Attribute1", "Attribute2", "Attribute3" }; public override void CreateMap() { Map(m => m.FirstName).Name("FirstName").Index(0); Map(m => m.LastName).Name("LastName").Index(1); Map(m => m.Attributes).ConvertUsing(row => attributeColumns .Select(column => row.GetField(column)) .Where(value => String.IsNullOrWhiteSpace(value) == false) ); } } 

那么你只需要这样的东西

 using (var reader = new CsvReader(new StreamReader(filePath))) { reader.Configuration.RegisterClassMap(); while (reader.Read()) { var card = reader.GetRecord(); } } 

我不知道这个库,所以下面的内容可能会有所帮助。

如果您已经有一个IEnumerable>表示包含所有列的所有记录,您可以使用此Linq查询来获取具有IList Attributes List

 IEnumerable> allRecords = .....; IEnumerable allPersons = allRecords .Select(rec => { var person = new Person(); person.FirstName = rec.ElementAt(0); person.LastName = rec.ElementAtOrDefault(1); person.Attributes = rec.Skip(2).ToList(); return person; }).ToList(); 

编辑 :下载了至少编译的库,无法真正测试它:

 IList allPersons = new List(); using (var reader = new CsvHelper.CsvReader(yourTextReader)) { while (reader.Read()) { var person = new Person(); person.FirstName = reader.CurrentRecord.ElementAt(0); person.LastName = reader.CurrentRecord.ElementAtOrDefault(1); person.Attributes = reader.CurrentRecord.Skip(2).ToList(); allPersons.Add(person); } } 

您实际上不需要事先定义列名,您可以从FieldHeaders属性中获取它们。 因此,在更动态的Neil答案版本中,您可以将Mapper定义为:

 public sealed class PersonMap : CsvClassMap { public override void CreateMap() { Map(m => m.FirstName).Name("FirstName").Index(0); Map(m => m.LastName).Name("LastName").Index(1); Map(m => m.Attributes).ConvertUsing(row => (row as CsvReader)?.FieldHeaders .Where(header => header.StartsWith("Attribute")) .Select(header => row.GetField(header)) .Where(value => !string.IsNullOrWhiteSpace(value)) .ToList() ); } } 

版本3支持读取和编写IEnumerable属性。 您可以像使用IList属性一样使用它。 您只需指定字段的起始索引即可。

 Map( m => m.Attributes ).Index( 2 );