2017-08-31 131 views
2

TO DO如何將CSV中的列映射到C#中的類屬性?

要創建一個控制檯應用程序,它可以讀取一個CSV文件和經銷商確定其中三個CSV文件(在列中的數據變化)它屬於。

我已經創建了一個控制檯應用程序,它正在使用SmartXLS庫從目錄中讀取所有的csv文件。

如何將每個文件的數據讀入列表中,並具有將每個「列」數據與我的類中定義的關聯類屬性(即列名)映射的簡單機制?

文件結構1:

使用日期,產品名稱,用戶ID,用令牌

  1. 20160428,三星,多爾曼@ stackoverflow.com

文件結構2 :

原因,月份,調整日期,交易ID,令牌調整,產品名稱,評論添加

  1. 斷網,10月15日,10月31日 - 15,73820274918-230934049372,045的Xbox,大橋設計InfraWorks 360

文件結構3:

使用日期,產品名稱,產品版本,用戶ID,機器名稱,服務器名稱,使用的令牌,使用小時

  1. 20161027,Gamepro,2016,11597,BC318010,LA847012,6,0.1

請幫助我重寫函數。

類:

public class Token 
    { 
      public DateTime Usagedate { get; set; } 
      public string Product_name { get; set; } 
      public string Product_Version { get; set; } 
      public string Userid { get; set; } 
      public string User_name { get; set; } 
      public string Machine_name { get; set; } 
      public string Server_name { get; set; } 
      public string Tokens_used { get; set; } 
      public string Use_count { get; set; } 

     } 

應用:

namespace ConsoleApp 
{ 
    class token 
    { 
     public List<Token> Tokens { get; set; } 
     public void TokenData() 
     { 
      Console.WriteLine("Begin Harvesting"); 

      CategorizeData();//function 
     } 

public void CategorizeData() 
     { 
      int count = 0; 

      Tokens = new List<Token>(); 

      var files = Directory.EnumerateFiles(@"C:\Users\Projects", "*.csv"); 

      foreach (string file in files) 
      { 

       SmartXLS.WorkBook WB = new WorkBook(); 
       WB.readCSV(file); 

       DataTable dt = WB.ExportDataTable(); 

       string dtSTR; 
       DataRow dr; 
       DataColumn dc; 
       for (int i = 1; i < dt.Rows.Count; i++) 
       { 

        dr = dt.Rows[i]; 

        try 
        { 
         // Map Columns with the class properties 
         // read them to the list 
        dtSTR = dr[0].ToString(); 
        if (string.IsNullOrEmpty(dtSTR)) continue; 

        var tkn = new Token(); 


        tkn.Usagedate = ParseDateTime(dtSTR); 
        tkn.Product_name = dr[1].ToString(); 
        tkn.Userid = dr[2].ToString(); 
        tkn.Tokens_used = dr[3].ToString(); 
        tkn.Reason = dr[4].ToString(); 


        Tokens.Add(tkn); 
        count++;  


        } 
        catch (Exception ex) 
        { } 


       } 

      } 
     } 
    } 

} 
+0

爲什麼你捕捉所有異常? – luxun

+0

@luxun。不需要擁有它嗎? – Rev4

+0

除非你打算做一些事情來處理例外情況。 – luxun

回答

4

我已經寫了一個CSV映射在上課前,但有一個組件調用CSVHelper我發現這是非常快,實際效果更好比我的。並且它有很多功能

string content = ""; 
var files = Directory.EnumerateFiles(@"C:\Users\Projects", "*.csv"); 
foreach (string file in files) 
    content += System.IO.File.ReadAllText(file) + Environment.NewLine; 

using(TextReader sr = new StringReader(content)) 
{ 
    var csv = new CsvReader(sr); 
     csv.Configuration.RegisterClassMap<TokenMap>(); 
     var records = csv.GetRecords<Token>(); 
} 





public class TokenMap : CsvClassMap<Token> 
{ 
    public TokenMap() 
    { 
     Map(m => m.Product_name); 
     Map(m => m.Product_Version); 
     Map(m => m.Userid); 
     Map(m => m.User_name); 
     Map(m => m.Machine_name); 
     Map(m => m.Server_name); 
     Map(m => m.Tokens_used); 
     Map(m => m.Use_count); 
    } 
} 
+0

看看修改後的代碼 –

+0

謝謝你的回覆。在我上面發佈的函數中,我正在讀取目錄中的所有csv文件。在你的代碼中,你從單個文件儀式中讀取?你能告訴我如何在這種情況下從我的目錄中讀取所有文件? – Rev4

+1

我更改了代碼,因此適合從目錄中讀取csv文件。 –

相關問題