Преобразование значений нотации Scientific в числовое при чтении CSV-файла, который автоматически сериализуется - PullRequest
0 голосов
/ 26 марта 2019

У меня есть 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()); 

как показано ниже

enter image description here

Ответы [ 3 ]

1 голос
/ 26 марта 2019

Во-первых, вы должны использовать выделенный CSV синтаксический анализатор, такой как CsvHelper , это потенциально сэкономит вам много времени.

Во-вторых, если вы хотите проанализироватьчисло использует что-то вроде decimal или double Parse с одним из вариантов.В этом случае NumberStyles.Float

decimal.Parse(number, NumberStyles.Float);

NumberStyles.Float

Указывает, что AllowLeadingWhite, AllowTrailingWhite, AllowLeadingSign, * 1022Используются стили * и AllowExponent.Это стиль составного числа.

AllowExponent

Указывает, что числовая строка может быть в экспоненциальной записи.Флаг AllowExponent позволяет анализируемой строке содержать показатель степени, начинающийся с символа «E» или «e», за которым следует необязательный положительный или отрицательный знак и целое число.Другими словами, он успешно анализирует строки в форме nnnExx, nnnE + xx и nnnE-xx.Он не допускает десятичный разделитель или знак в значении и мантиссе;чтобы разрешить анализ этих элементов в строке, используйте флаги AllowDecimalPoint и AllowLeadingSign или используйте составной стиль, который включает эти отдельные флаги.

Обновление

Вы можете использовать регулярное выражение, чтобы попытаться определить, содержит ли поле фактическое число.Например, \d.\d+E[+-]\d+ или даже лучше, просто используйте decminal.TryParse с соответствующими параметрами.

1 голос
/ 26 марта 2019

Вы можете разобрать эту строку в десятичную

    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: .net fiddle

0 голосов
/ 26 марта 2019

Проверьте, является ли это поле числовым и в научной нотации, а затем отформатируйте его как:

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