CSV助手多个相同的列名称

问题描述:

我有具有相同头名称的多个列的CSV文件。我正在使用CsvHelper库。 我想收集他们的行值到一个列表中,但我收集第一行值多次我指定标题,而不是从另一个索引位置收集。 ex。 COLUMN COLUMN Test1 Test2 Test3 Test4 我期望我的列表首先有两个元素,值为Test1,Test2,第二个值为Test3,Test4,但是第一行的值为Test1,Test1和Test3,Test3。CSV助手多个相同的列名称

这是可以这样用映射来完成此列

Map(m => m.COLUMN).ConvertUsing(row => 
       (row as CsvReader)?.FieldHeaders 
        .Where(header => header.StartsWith("COLUMN")) 
        .Select(header => row.GetField<string>(header)) 
        .Where(value => !string.IsNullOrWhiteSpace(value)) 
        .ToList() 
      ); 

映射? 如果我将列名更改为COLUMN1和COLUMN2,这可行,但这不是我的问题的解决方案。

+0

的Test1和Test2的值是第一行和Test3的和TEST4在第二 – user3690217

有很多方法可以做到这一点。这是一个例子。

void Main() 
{ 
    using (var stream = new MemoryStream()) 
    using (var writer = new StreamWriter(stream)) 
    using (var reader = new StreamReader(stream)) 
    using (var csv = new CsvReader(reader)) 
    { 
     writer.WriteLine("Id,Name,List,List,List"); 
     writer.WriteLine("1,one,a,b,c"); 
     writer.WriteLine("1,two,d,e,f"); 
     writer.Flush(); 
     stream.Position = 0; 

     csv.Configuration.RegisterClassMap<TestMap>(); 
     csv.GetRecords<Test>().Dump(); 
    } 
} 

public class Test 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public List<string> List { get; set; } 
} 

public sealed class TestMap : CsvClassMap<Test> 
{ 
    public TestMap() 
    { 
     Map(m => m.Id); 
     Map(m => m.Name); 
     Map(m => m.List).ConvertUsing(row => 
     { 
      var list = new List<string>(); 
      list.Add(row.GetField("List", 0)); 
      list.Add(row.GetField("List", 1)); 
      list.Add(row.GetField("List", 2)); 
      return list; 
     }); 
    } 
} 

此外,第3版具有映射到内置的可枚举。

Map(m => m.List).Name("List"); 
+0

谢谢乔希,信息是非常有用的解决我的问题。 – user3690217