2017-10-04 2 views
0

J'ai un fichier CSV qui a plusieurs colonnes avec le même nom d'en-tête. J'utilise la bibliothèque CsvHelper. Je veux collecter leurs valeurs de ligne dans une liste, mais je collecte la valeur de la première ligne autant de fois que j'ai l'en-tête spécifié et ne pas collecter à partir d'une autre position d'index. ex. COLONNE COLONNE Test1 Test2 Test3 Test4 Je m'attends à ce que ma liste ait deux éléments avec la valeur Test1, Test2 et la seconde avec les valeurs Test3, Test4 mais la première ligne a les valeurs Test1, Test1 et second Test3, Test3.Aide CSV Multiple Même colonne Noms

C'est la mise en correspondance de cette colonne

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() 
      ); 

Cela peut-il être fait avec la cartographie? Si je change de nom de colonne en COLUMN1 et COLUMN2 cela fonctionne mais ce n'est pas la solution à mon problème.

+0

Test1 et les valeurs Test2 sont dans la première rangée et Test3 et Test4 sont dans la deuxième – user3690217

Répondre

0

Il y a plusieurs façons de le faire. Voici un exemple.

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; 
     }); 
    } 
} 

En outre, la version 3 a la cartographie à enumerables intégrés.

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

Merci Josh, l'information était très utile pour résoudre mon problème. – user3690217