在C#中读取CSV时如何将科学记数值解析回原始值

时间:2016-01-28 16:53:47

标签: c# csv

我正在开发一个通过网址导入csv文件的天气图应用程序。 csv中的日期字段存储为字符串,如201601280330,即今天的2016年1月28日3:30。但是,当通过流读取器读取csv时,该值将以科学计数法返回,如2.01601E + 11。我没有尝试任何东西似乎返回整个值201601280330。

例如:

var date = "2.01601E+11"; var d = Decimal.Parse(date, System.Globalization.NumberStyles.Float);

返回201601000000砍掉字符串的剩余部分。有没有人知道返回完整价值的方法。当我将csv本地保存为文本文件时,会保存正确的值201601280330,而不是2.01601E+11。无论如何在代码中得到这个而不必先保存?我使用下面的代码来阅读csv文件。

    public static DataTable GetDataTableFromCSVFile(string path)
    {
        DataTable dt = new DataTable();
        try
        {
            using (StreamReader sr = new StreamReader(path))
            {
                string[] headers = sr.ReadLine().Split(',');

                foreach (string header in headers)
                {
                    if (header.Contains("ERROR:"))
                    {
                        return null;
                    }

                    dt.Columns.Add(header);
                }
                while (!sr.EndOfStream)
                {
                    string[] rows = sr.ReadLine().Split(',');
                    DataRow dr = dt.NewRow();
                    for (int i = 0; i < headers.Length; i++)
                    {
                        dr[i] = rows[i];
                    }
                    dt.Rows.Add(dr);
                }
            }
        }

修改

虽然这并没有为我遇到的问题提供技术答案,但如果他们遇到这个问题,可能会提供更好的解释并帮助他人。发送给我进行测试的一些示例csv文件已在Excel中编辑,以使csv变小然后保存。进一步测试后,看起来只有在Excel中编辑的csv文件才会出现问题。暂时,这解决了我的问题,因为我们不会下载csv文件并在Excel中编辑它们,而是直接从网址中提取它们。我上面发布的代码将读取正确的值而不用表示法,而对于在Excel中编辑的csv,它只会使用科学记数法读取值。除非我错了,否则我认为Excel必须在已编辑的csv文件中添加一些内容,以防止正确读取值。

2 个答案:

答案 0 :(得分:2)

我的原始答案质疑你是否使用Excel,但是你没有在你的问题中提到我正确地告诉我我不在话题,所以我改变了它。既然你提供了一个确实提到Excel的后续答案我已经改回来了,这就是我原来写的:

  

一旦将值转换为科学记数法,就无法将其转换回来。执行此转换是Excel的限制。如果在导入数据时选择了文本的列类型(而不是常规),则数据将逐字导入,Excel不会将其转换为科学记数法。

正如我所怀疑的那样,将数值数据转换为科学记数法是Excel(不是您的代码)。我已多次看到此问题,并建议人们不要使用Excel打开CSV文件。如果必须,则导入而不是打开,以便指定数值列的数据类型。

答案 1 :(得分:0)

虽然这并没有为我遇到的问题提供技术答案,但如果他们遇到这个问题,可能会提供更好的解释并帮助他人。发送给我进行测试的一些示例csv文件已在Excel中编辑,以使csv变小然后保存。进一步测试后,看起来只有在Excel中编辑的csv文件才会出现问题。暂时,这解决了我的问题,因为我们不会下载csv文件并在Excel中编辑它们,而是直接从网址中提取它们。我上面发布的代码将读取正确的值而不用表示法,而对于在Excel中编辑的csv,它只会使用科学记数法读取值。除非我错了,否则我认为Excel必须在已编辑的csv文件中添加一些内容,以防止正确读取值。