2017-10-04 6 views
0

複数の列に同じヘッダー名を持つCSVファイルがあります。私はCsvHelperライブラリを使用しています。 私は行の値を1つのリストに集めたいが、私はヘッダーを指定して、別のインデックスの位置から収集しないで何度も最初の行の値を収集している。 ex。 COLUMN COLUMN COLUMN COLUMN COLUMN COLUMN COLUMN COLUMN Test1 Test2 Test3 Test4 私のリストには、値Test1、Test2、値Test3、Test4の2つの要素がありますが、最初の行には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が組み込まenumerablesへのマッピングを持っています。

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

であるジョシュ、情報が非常に有用であったありがとう私の問題を解決する。 – user3690217

関連する問題