2017-10-04 10 views
0

동일한 헤더 이름을 가진 여러 열이있는 CSV 파일이 있습니다. CsvHelper 라이브러리를 사용하고 있습니다. 하나의 목록으로 행 값을 수집하고 싶지만 다른 인덱스 위치에서 수집하지 않고 지정된 헤더를 여러 번 사용하여 첫 번째 행 값을 수집합니다. 예. 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를 값은 첫 번째 행에 있고 테스트 3과 테스트 4 번째 – 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에 내장 enumerables 매핑이있다.

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

당신에게 조쉬 감사에서, 정보는 매우 유용하다 내 문제를 해결하기 위해. – user3690217