2016-05-13 10 views
0

Grundsätzlich versuche ich, CSV-Datei mit CSVHelper zu lesen. Der Trick besteht darin, dass es mehr als eine Datei gibt (jedes Mal, wenn der Benutzer eine andere auswählt) und hat jede von ihnen eine andere Struktur.Lesen verschiedener CSV mit CSVHelper

Die einzige Sache, die sie teilen, ist die erste Spalte mit dem Namen "Id", dann hat jede von ihnen unterschiedliche Anzahl von Spalten (von 2 zusätzlichen bis zu 5) mit verschiedenen Datentypen.

Ich habe versucht, dies so zu tun:

public class Country 
{ 
    public int Id { get; set; } 
    public IList<string> Attributes { get; set; } 
} 

public sealed class CountryMap : CsvClassMap<Country> 
{ 
    private List<string> attributeColumns = 
     new List<string> { "Attribute1", "Attribute2", "Attribute3", "Attribute4", "Attribute5" }; 

    public override void CreateMap() 
    { 
     Map(m => m.Id).Name("Id").Index(0); 
     Map(m => m.Attributes).ConvertUsing(row => 
      attributeColumns 
       .Select(column => row.GetField<string>(column)) 
       .Where(value => String.IsNullOrWhiteSpace(value) == false) 
      ); 
    } 
} 

Und dann mit:

using (var reader = new CsvReader(new StreamReader(FilePath,encoding.UTF8))) 
{ 
    reader.Configuration.RegisterClassMap<CountryMap>(); 
    while (reader.Read()) 
    { 
     var card = reader.GetRecord<Country>(); 
    } 
} 

Aber nur das, was ich bekommen ist Auto = null.

Ich wäre wirklich dankbar für alle Tipps und Antworten.

+0

meine CSVReader Klasse verwenden auf der Homepage folgenden: http://stackoverflow.com/questions/30129406/reading-data-from-csv-to-screen-output. Die Ergebnisse werden in eine DataTable eingefügt. Sie können die Klasse mehrmals aufrufen und die zweiten Ergebnisse in eine andere DataTable einfügen. Verwenden Sie einen Join, um zwei Datentypen zusammenzuführen. – jdweng

Antwort

0

Ein anderer Ansatz wäre, einfach die .Net OleDB-Funktion zu verwenden, um eine DataTable-Form der CSV-Datei für Sie zu erstellen. Da die DataTable bereits die notwendigen Schemadaten enthält, sollte das Mapping der Dateispalten auf Ihre internen Klassen vereinfacht werden.

using System.Data; 
    using System.Data.OleDb; 
    using System.IO; 

    namespace App.Data 
    { 
     public class CsvFileHelper 
     { 
      public static DataTable ReadAsDataTable(string fileFullName) 
      { 
       DataTable tableCSV; 

       using (OleDbConnection connection = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source = " + Path.GetDirectoryName(fileFullName) + "; Extended Properties = \"Text;HDR=YES;FMT=Delimited\"")) 
       { 
        connection.Open(); 

        using (OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM " + Path.GetFileName(fileFullName), connection)) 
        { 
         DataSet ds = new DataSet("CSVDataSet"); 
         adapter.Fill(ds); 

         tableCSV = ds.Tables[0]; 
        } 
       } 

       return tableCSV; 
      } 
     } 
    } 
+0

Danke, das war buchstäblich das, was ich gesucht habe. Ich wusste nichts davon, weil ich gerade angefangen habe in C# zu arbeiten. –