TO DO
若要创建控制台应用程序,可以读取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)
{ }
}
}
}
}
}发布于 2017-08-31 13:03:00
我以前曾为类编写过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);
}
}https://stackoverflow.com/questions/45981943
复制相似问题