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