首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将列从CSV映射到C#中的类属性?

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

Stack Overflow用户
提问于 2017-08-31 12:53:50
回答 1查看 2K关注 0票数 2

TO DO

若要创建控制台应用程序,可以读取CSV文件并自动确定它属于哪个CSV文件(列数据各不相同)。

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

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

文件结构1:

使用日期、产品名称、用户Id、使用的令牌

  1. 20160428,三星,dorman@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

好样的,帮我重写一下这个函数。

类:

代码语言:javascript
运行
复制
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; }

        }

应用程序:

代码语言:javascript
运行
复制
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)
                    { }


                }

            }
        }
    } 

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-31 13:03:00

我以前曾为类编写过CSV映射器,但是有一个名为CSVHelper的组件,我发现它非常快速,实际上比我的组件工作得更好。它有很多特点

代码语言:javascript
运行
复制
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);
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45981943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档