2015-08-23 6 views
1

У меня есть текстовый файл размером 100 МБ + с этим форматом. Образец небольшого файла - here.Ошибка обработки текстового файла

and -0.436527 -0.515304 -0.002056 -0.227969 0.177528 0.201756... 
with 0.101336 0.493859 -0.081095 -0.391502 -0.111579 0.388659... 
voice -0.168610 0.413912 0.423446 0.484159 -0.546614 0.558571... 

Конечные цифры могут быть 100 + цифры, как положительные, так и отрицательные. Я использовал этот фрагмент кода для разбора (найти определенный текст и суммировать все конечные числа этого текста) на основе определенного предложения.

double[] vectorOne = File.ReadLines(filename) 
        .Where(line => line.Contains("drop")) 
        .SelectMany(line => line.Split()) 
        .Where(str => str.All(c => Char.IsDigit(c) || c == '-' || c == '.')) 
        .Select(str => Double.Parse(str, CultureInfo.InvariantCulture)) 
        .ToArray(); 

      MessageBox.Show("", vectorOne.Sum().ToString()); 

Но я получаю следующее сообщение об ошибке: Input string was not in a correct format. at Double.Parse(str, CultureInfo.InvariantCulture)).

Любая помощь высоко ценится !.

ответ

2

Ваша проблема здесь:

.SelectMany(line => line.Split()) 

Поскольку у вас есть пространство в конце каждой строки, это даст вам пустую запись для каждой строки Aswell (Split по умолчанию не удаляет пустые записей)

Чтобы избежать этого вы можете сделать это:

.SelectMany(line => line.Split(new char[] { ' ' },StringSplitOptions.RemoveEmptyEntries)) 

Я попробовал его с вашим файлом output.bin, он работал хорошо на этот раз.

Edit:

double[] vectorOne = File.ReadLines("myOutput.bin") 
        .Where(line => line.Contains("drop")) 
        .Select(x => x.Trim()) 
        .SelectMany(line => line.Split()) 
        .Where(str => str.All(c => Char.IsDigit(c) || c == '-' || c == '.')) 
        .Select(str => Double.Parse(str, CultureInfo.InvariantCulture)) 
        .ToArray(); 

Это работает как хорошо, вы в основном обрезать строку, прежде чем разбить его, удаляя окончательный пустой символ

+0

Brilliant! Благодаря! –