Преобразование массива строк в многомерный double

#c# #windows

#c# #Windows

Вопрос:

Мне нужно прочитать матрицу из файла в double[,] . До сих пор файл можно читать как строку[]. Структура данных выглядит следующим образом: введите описание изображения здесь

Но преобразование не работает.

Я уже перепробовал множество статей stackoverflow, но это всегда заканчивалось неудачей: «Входная строка была не в правильном формате». Важно, чтобы все значения были двойными и разделялись тремя пробелами.

Я прочитал файл следующим образом:

 var text = File.ReadAllLines(@"right.txt");
  

Комментарии:

1. Как вы выполняете преобразование? Где ваш код для этого? Вы должны использовать double.Parse() для каждой репрезентативной строки. Если вы не публикуете свой код, мы не знаем, почему он не работает. И нам нет смысла снова повторять то, что вы прочитали в статьях.

Ответ №1:

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

Вероятно, есть более сжатые способы сделать это, однако вы можете увидеть идею.

Неровный

 var jaggedArray = File.ReadAllLines(@"d:right.txt")
                        .Where(x => !string.IsNullOrWhiteSpace(x))
                        .Select(x => x.Split(new[]{' '},StringSplitOptions.RemoveEmptyEntries)
                                     .Select(double.Parse)
                                     .ToArray())
                        .ToArray();
  

Многомерный

 var lines = File.ReadAllLines(@"d:right.txt")
                  .Where(x => !string.IsNullOrWhiteSpace(x))
                  .Select(x => x.Split(new[]{' '},StringSplitOptions.RemoveEmptyEntries)
                               .Select(double.Parse)
                               .ToList())
                  .ToList();

var h = lines.Count();
var w = lines.Max(x => x.Count);
var multiArray = new double[h, w];

for (var i = 0; i < lines.Count; i  )
   for (var j = 0; j < lines[i].Count; j  )
      multiArray[i, j] = lines[i][j];
  

Примечание: Полностью непроверенный, и я не несу ответственности за то, что люди калечат или иным образом вредят с помощью этого кода
Примечание 2: Нет проверки ошибок или отказоустойчивости, если в вашем файле есть мусор, это, скорее всего, приведет к сбою

Обновить

Есть ли способ отладить / исправить это? Может быть, проблема в том, что двойные значения разделены 3 пробелами, а не только 1 пробелом? Есть ли способ исправить это в инструкции LINQ?

Да, если есть несколько пробелов, использование StringSplitOptions.RemoveEmptyEntries должно сработать

 Split(new [] {' '},StringSplitOptions.RemoveEmptyEntries)
  

Однако обратите внимание, это действительно предполагает, что каждое разделенное значение может быть преобразовано в double , и нет пустых строк (даже в конце файла)

Проблему с пустой строкой можно решить, используя нечто подобное, включенное в инструкцию linq

 File.ReadAllLines(@"right.txt")
    .Where(x => !string.IsNullOrWhiteSpace(x))
    ...
  

Комментарии:

1. Многомерный способ кажется хорошим, но у меня он не работает. Я получаю исключение в инструкции LINQ. System.FormatException: 'Input string was not in a correct format.' Есть ли способ отладить / исправить это? Может быть, проблема в том, что двойные значения разделены 3 пробелами, а не только 1 пробелом? Есть ли способ исправить это в инструкции LINQ?

2. спасибо, но .Where(x => !string.IsNullOrWhiteSpace(x)) не работает. Я справился с отладчиком, несколько пробелов все еще присутствуют в строке.

3. @Sabina эта строка имеет дело с пустыми строками, опция разделения имеет дело с несколькими пробелами. вы уверены, что это пробелы, а не табуляции или что-то в этом роде?

4. Вы можете быть уверены, Split(new [] {' ',t'},StringSplitOptions.RemoveEmptyEntries)

5. Также давайте не будем гадать, можете ли вы добавить свои образцы данных в вопрос или ссылку на файл онлайн, так как это может продолжаться весь день