2016-05-13 78 views
0

基本上我想要做的是使用CSVHelper讀取CSV文件。訣竅是有多個文件(每次用戶選擇不同的文件)和,他們每個人都有不同的結構使用CSVHelper讀取不同的CSV

他們共享的只有第一個col命名爲「Id」,然後它們每個都有不同數據類型的cols數目(從2增加到5)。

我試圖做到這一點像:

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

再搭配:

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

但只有我得到的是車= NULL。

我會非常感謝任何提示和答案。

+0

在以下網頁上使用我的CSVReader類:http://stackoverflow.com/questions/30129406/reading-data-from-csv-to-screen-output。結果放入DataTable中。您可以多次調用該類,並將第二個結果放入不同的DataTable中。使用連接來合併兩個數據表。 – jdweng

回答

0

一種不同的方法是簡單地使用.Net OleDB提供來爲您創建CSV文件的DataTable。由於DataTable已經包含必要的模式數據,它應該簡化文件列到內部類的映射。

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

謝謝,這實際上是我在找的東西。我不知道這一點,因爲我剛開始使用C#。 –