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

本文关键字:原始 读取 CSV | 更新日期: 2023-09-27 18:32:15

我正在开发一个通过 url 导入 csv 文件的天气图应用程序。csv 中的日期字段存储为类似 201601280330 的字符串,即今天的日期 1/28/2016 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 中编辑它们,而是直接从 url 中提取它们。我上面发布的代码将读取正确的值而不带符号,而对于在 Excel 中编辑的 csv,它只会读取带有科学记数法的值。除非我错了,否则我认为 Excel 必须向编辑的 csv 文件添加一些内容,以防止正确读取值。

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

我最初的回答质疑您是否在使用Excel,但由于您在问题中没有提到这一点,因此我正确地被告知我跑题了,所以我更改了它。既然您已经提供了确实提到了 Excel 的后续答案,我已经将其改回来了,这是我最初写的:

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

正如我所怀疑的,是Excel(不是您的代码)将数字数据更改为科学记数法。我已经多次看到这个问题,并建议人们不要使用Excel打开CSV文件。如果必须这样做,请导入而不是打开,以便可以指定数字列的数据类型。

虽然这并不能为我遇到的问题提供技术答案,但它可能会提供更好的解释,并在遇到此问题时帮助其他人。发送给我进行测试的一些示例 csv 文件已在 Excel 中进行了编辑,以使 csv 更小,然后保存。经过进一步测试,似乎问题仅发生在在Excel中编辑的csv文件上。暂时,这为我解决了问题,因为我们不会下载 csv 文件并在 Excel 中编辑它们,而是直接从 url 中提取它们。我上面发布的代码将读取正确的值而不带符号,而对于在 Excel 中编辑的 csv,它只会读取带有科学记数法的值。除非我错了,否则我认为 Excel 必须向编辑的 csv 文件添加一些内容,以防止正确读取值。