我正在使用OleDBConnection读取CSV文件并将其转换为DataTable。这是我的功能:
private DataTable csv2datatable(string caminho)
{
criarCsvSchema(caminho);
DataTable dt = new DataTable("data");
using (OleDbConnection conexao = new OleDbConnection(
"Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=\"" + Path.GetDirectoryName(caminho) + "\";" +
"Extended Properties='text;HDR=yes;'"
)
)
{
using (OleDbCommand cmd = new OleDbCommand(
string.Format("select * from [{0}]",new FileInfo(caminho).Name),
conexao
)
)
{
conexao.Open();
using(OleDbDataAdapter adaptador = new OleDbDataAdapter(cmd))
{
adaptador.Fill(dt);
}
}
}
return dt;
}
方法“criarCsvSchema”使用以下配置创建schema.ini:
[CAM jan.csv]
ColNameHeader=True
Format=Delimited(;)
DecimalSymbol=,
我的CSV文件有这种类型的结构(它没有引号):
510,54; 0,00; 0,00; 0,00; 15,31;
因此,小数符号为',',分隔符为';'。当我运行这个项目时,我得到了这个DataTable:
我无法理解的是:为什么第一列“510,54”是正确的而其他列是以日期回归?
谢谢!
@edit - csv文件的前5行(包括标题):
https://github.com/rponciano/just-show/blob/master/shared-copy.csv
答案 0 :(得分:0)
你的整个结果很奇怪。单元格“510,54”“0,00”“0,00”“0,00”和15,31被解释为:1浮点数和4个日期时间?
我最好的猜测是,所有其他值都评估为30/12/1899 00:00,在输出期间被截断的时间为“可能无关紧要”。所以无论你在这里做错了什么,你都可能在第一个值之后做错了。
如果不知道DataTable的实际值以及在输出为字符串之前它们是如何转换的(很好的代码,文化),真的很难知道。使用显示技术这样简单的东西可能有所帮助,因为5+中的每一个都有不同的DataTable。
答案 1 :(得分:0)
作为@RajN commet,我只需要在schema.ini中强制使用DateTimeFormat。
“尝试在schema.ini文件中强制使用DateTimeFormat = YYYY-MM-DD。”