待办事项
创建一个控制台应用程序,该应用程序可以读取CSV文件并自动确定它所属的三个CSV文件中的哪一个(列数据不同)。
我创建了一个控制台应用程序,它正在使用SmartXLS库从目录中读取所有csv文件。
如何将每个文件的数据读入列表,并有一个简单的机制,用于将每个“列”数据映射到我在班级中定义的相关类属性(即列名)?
文件结构1:
使用日期,产品名称,用户ID,使用的标记
文件结构2:
原因,月份,调整日期,交易ID,调整后的代码,产品名称,添加评论
文件结构3:
使用日期,产品名称,产品版本,用户ID,机器名称,服务器名称,使用的标记,使用小时数
请帮助我重写函数。
类别:
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 :(得分: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);
}
}