C# 将 CSV 读取到 DataTable,CSV 值中包含逗号
C# Read CSV to DataTable with comma inside CSV values
我正在使用 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 行(包括 header):
https://github.com/rponciano/just-show/blob/master/shared-copy.csv
你的整个结果很奇怪。单元格“510,54”“0,00”“0,00”“0,00”和 15,31 被解释为:1 个浮点数和 4 个日期时间?
我最好的猜测是其他值都计算为 30/12/1899 00:00,在输出过程中小时数被截断为 "propably irrelevant"。所以无论你在这里做错了什么,你很可能对超过第一个值的所有事情都做错了。
如果不知道 DataTable 的实际值以及它们在输出为字符串之前如何转换(代码,文化),真的很难知道。像所使用的显示技术这样简单的东西可能会有所帮助,因为 5+ 中的每一个都有不同的数据表。
作为@RajN commet,我只需要在 schema.ini.
中强制使用 DateTimeFormat
"Try forcing the DateTimeFormat = YYYY-MM-DD in your schema.ini file."
我正在使用 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 行(包括 header):
https://github.com/rponciano/just-show/blob/master/shared-copy.csv
你的整个结果很奇怪。单元格“510,54”“0,00”“0,00”“0,00”和 15,31 被解释为:1 个浮点数和 4 个日期时间?
我最好的猜测是其他值都计算为 30/12/1899 00:00,在输出过程中小时数被截断为 "propably irrelevant"。所以无论你在这里做错了什么,你很可能对超过第一个值的所有事情都做错了。
如果不知道 DataTable 的实际值以及它们在输出为字符串之前如何转换(代码,文化),真的很难知道。像所使用的显示技术这样简单的东西可能会有所帮助,因为 5+ 中的每一个都有不同的数据表。
作为@RajN commet,我只需要在 schema.ini.
中强制使用 DateTimeFormat"Try forcing the DateTimeFormat = YYYY-MM-DD in your schema.ini file."