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."