Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 读取自动序列化的csv文件时将科学符号值转换为数字值_C#_Csv_Console Application_Inputstreamreader - Fatal编程技术网

C# 读取自动序列化的csv文件时将科学符号值转换为数字值

C# 读取自动序列化的csv文件时将科学符号值转换为数字值,c#,csv,console-application,inputstreamreader,C#,Csv,Console Application,Inputstreamreader,我有一个csv文件,我必须导入数据库。通过流读取器读取文件时,一些值会转换为科学符号,如“5.00E+11”。我必须将其恢复为原始值。这是由作业完成的,因此我无法手动将单元格格式化为“文本”或“特殊”。当该单元格被格式化为“文本”或“特殊”时,它工作正常 我需要的结果如下: "5.00E+11" should be converted into "500000000000" "8.12E+12" should be converted into "8122280000000"

我有一个csv文件,我必须导入数据库。通过流读取器读取文件时,一些值会转换为科学符号,如“5.00E+11”。我必须将其恢复为原始值。这是由作业完成的,因此我无法手动将单元格格式化为“文本”或“特殊”。当该单元格被格式化为“文本”或“特殊”时,它工作正常

我需要的结果如下:

    "5.00E+11" should be converted into "500000000000"
    "8.12E+12" should be converted into "8122280000000"
我读取文件的代码如下:

    /// <summary>
    /// This is used to read the csv file
    /// </summary>
    using (StreamReader reader = new StreamReader(comepleteFilePath))
    {
       values = reader.ReadToEnd()
                      .Split(new string[] 
                      { Environment.NewLine },
                       StringSplitOptions.RemoveEmptyEntries
                      ).ToList();
     }         

    var _tempNuber = Convert.ToString(splits[13].Trim()); 
//
///这用于读取csv文件
/// 
使用(StreamReader=新StreamReader(ComePletFilePath))
{
values=reader.ReadToEnd()
.Split(新字符串[])
{Environment.NewLine},
StringSplitOptions.RemoveEmptyEntries
).ToList();
}         
var_tempNuber=Convert.ToString(拆分[13].Trim());
如下


您可以将该字符串解析为十进制

    string s = "5.00E+11";
    decimal d = decimal.Parse(s, NumberStyles.Float);
输出

500000000000
若您只想解析一个指数元素,那个么可以检查给定的字符串是否是指数的

double d = 0;
if(str.Contains("E") && double.TryParse(str, out d))
{
   //Your conversion
}

POC:

首先,您应该使用像CsvHelper这样的专用CSV解析器,这可能会为您节省大量时间

其次,如果您想解析一个数字,请使用类似于
decimal
double
parse
的选项之一。在这种情况下,
numberstyle.Float

decimal.Parse(number, NumberStyles.Float);

表示
allowReadingWhite
AllowTrailingWhite
allowReadingSign
AllowDecimalPoint
AllowExponent
样式是 用过。这是一种复合数字样式

AllowExponent

指示数字字符串可以采用指数表示法。这个 AllowExponent标志允许解析的字符串包含指数 以“E”或“E”字符开头,后跟 可选的正负号和整数。换句话说,它 成功解析格式为nnnExx、nnnE+xx和nnnE xx的字符串。 它不允许在有效位或有效位中使用十进制分隔符或符号 尾数;要允许解析字符串中的这些元素,请使用 AllowDecimalPoint和AllowReadingSign标志,或使用复合样式 这包括这些单独的标志

更新


您可以使用regex尝试并确定字段是否包含实际数字。像
\d.\d+E[+-]\d+
或者更好的方法是使用带有适当选项的
decminal.TryParse

检查该字段是否为数字和科学符号,然后按以下格式设置:

var _tempNuber =  splits[13].Trim().Contains('+') ? decimal.Parse(splits[13].Trim(), NumberStyles.Float).ToString() 
                                                  : splits[13].Trim();

可能的重复不是完全重复,而是读取excel自动序列化的值的问题,同一字段也有不同类型的数据;有些数据是文本,有些是数字,有些是文本和数字的组合,所以我不能直接硬编码任何格式化程序。问题是只有大的数值。我必须检查它是否是一个数值,并且使用科学的记数法,然后必须使用:decimal.Parse(number,NumberStyles.Float)@SatishChandramurya
decminal.TryParse
将同时做这两件事,如果
拆分[13]
包含类似
1+2
的内容,则不可能,因为不允许使用特殊字符。您的最后一个注释与您提到的指数数(它包含
+
字符串)相矛盾在上一份声明中你说没有特别的角色。。。我不知道;t khow在
中出现的价值观会分裂[13]
,但您在回答中提出的解决方案是不可持续的(我相信),如果它对您有效,那么我对您的建议感到高兴answer@Prasad让我说清楚;在将数据导出到csv文件的数据库表中,不允许特殊字符从应用程序前端进入该列。现在,在csv文件的单元格[13]中,值为“500000000000”,但当我用上述代码读取该字段时,由于excel自动序列化,它被读取为“5.00E+11”。我无法检查“E”,因为文本值可能也包含该字符。因此,我必须检查“+”字符,而不是ie.str.Contains(“+”)。我还有
TryParse
的附加条件检查,这对于检查传递的字符串是否为双精度类型以及Exp number是否始终包含
+和E/E