2017-10-04 21 views
0

我有具有相同頭名稱的多個列的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

回答

0

有很多方法可以做到這一點。這是一個例子。

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

相關問題