C#在CSV值内使用逗号将CSV读取到DataTable

时间:2018-01-05 18:07:33

标签: c# visual-studio csv datatable oledbconnection

我正在使用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:

output

我无法理解的是:为什么第一列“510,54”是正确的而其他列是以日期回归?

谢谢!

@edit - csv文件的前5行(包括标题):
https://github.com/rponciano/just-show/blob/master/shared-copy.csv

2 个答案:

答案 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。”