如何在 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 文件添加一些内容,以防止正确读取值。
我最初的回答质疑您是否在使用Excel,但由于您在问题中没有提到这一点,因此我正确地被告知我跑题了,所以我更改了它。既然您已经提供了确实提到了 Excel 的后续答案,我已经将其改回来了,这是我最初写的:
一旦该值被转换为科学记数法,就无法转换回来。这是执行此转换的 Excel 的限制。如果在导入数据时选择"文本"(而不是"常规")的列类型,则将逐字导入数据,并且 Excel 不会将其转换为科学记数法。
正如我所怀疑的,是Excel(不是您的代码)将数字数据更改为科学记数法。我已经多次看到这个问题,并建议人们不要使用Excel打开CSV文件。如果必须这样做,请导入而不是打开,以便可以指定数字列的数据类型。
虽然这并不能为我遇到的问题提供技术答案,但它可能会提供更好的解释,并在遇到此问题时帮助其他人。发送给我进行测试的一些示例 csv 文件已在 Excel 中进行了编辑,以使 csv 更小,然后保存。经过进一步测试,似乎问题仅发生在在Excel中编辑的csv文件上。暂时,这为我解决了问题,因为我们不会下载 csv 文件并在 Excel 中编辑它们,而是直接从 url 中提取它们。我上面发布的代码将读取正确的值而不带符号,而对于在 Excel 中编辑的 csv,它只会读取带有科学记数法的值。除非我错了,否则我认为 Excel 必须向编辑的 csv 文件添加一些内容,以防止正确读取值。