#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. Также давайте не будем гадать, можете ли вы добавить свои образцы данных в вопрос или ссылку на файл онлайн, так как это может продолжаться весь день