如何将CSV中的列映射到C#中的类属性?

时间:2017-08-31 12:53:51

标签: c# asp.net .net asp.net-mvc

待办事项

创建一个控制台应用程序,该应用程序可以读取CSV文件并自动确定它所属的三个CSV文件中的哪一个(列数据不同)。

我创建了一个控制台应用程序,它正在使用SmartXLS库从目录中读取所有csv文件。

如何将每个文件的数据读入列表,并有一个简单的机制,用于将每个“列”数据映射到我在班级中定义的相关类属性(即列名)?

文件结构1:

使用日期,产品名称,用户ID,使用的标记

  1. 20160428,三星,多尔曼@ stackoverflow.com
  2. 文件结构2:

    原因,月份,调整日期,交易ID,调整后的代码,产品名称,添加评论

    1. Off network,10-Oct,31-Oct-15,73820274918-230934049372,045,Xbox,InfraWorks 360 Bridge Design。
    2. 文件结构3:

      使用日期,产品名称,产品版本,用户ID,机器名称,服务器名称,使用的标记,使用小时数

      1. 20161027,Gamepro,2016,11597,BC318010,LA847012,6,0.1
      2. 请帮助我重写函数。

        类别:

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

1 个答案:

答案 0 :(得分: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);
    }
}