2015-02-18 1 views
0

Я работаю с алгоритмом SMACOF и имею небольшую проблему. Я пытаюсь прочитать текстовый файл, который содержит такие элементы:C# Нужна помощь для чтения текстового файла в 2D или неровном массиве

5.1 3.5 1.4 0.2 
4.9 3.0 1.4 0.2 
4.7 3.2 1.3 0.2 
4.6 3.1 1.5 0.2 

Где находится несколько сотен строк этих элементов. До сих пор мне удалось прочитать только первую строчку и не знаю, почему она не читает все строки. Вот мой код:

static void Main(string[] args) 
    { 
     string[] lines = File.ReadAllLines("duom.txt"); 
     string[][] grid = new string[lines.Length][]; 
     for (int i = 0; i < lines.Length; i++) 
     { 
      grid[i] = lines[i].Split(','); 
     } 
     for (int i = 0; i < lines.Length; i++) 
     { 
      for (int j = 0; j < lines[i].Length; j++) 
      { 
       Console.WriteLine(grid[i][j]); 
       Console.ReadLine(); 
      } 
     } 
    } 

Так, может быть, вы, ребята, можете объяснить, что случилось с моим кодом, и как propely прочитать текстовый файл? Благодарю.

+0

Ваш образец не содержит запятые. Ты уверен, что ты раскалываешься на правильном персонаже? –

ответ

2

Ваш второй цикл выходит за пределы, поскольку ваш цикл по длине строки (в символах) не является длиной массива в сетке [i].

static void Main(string[] args) 
    { 
     string[] lines = File.ReadAllLines("duom.txt"); 
     string[][] grid = new string[lines.Length][]; 
     for (int i = 0; i < lines.Length; i++) 
     { 
      grid[i] = lines[i].Split(','); 
     } 
     for (int i = 0; i < lines.Length; i++) 
     { 
      for (int j = 0; j < **grid**[i].Length; j++) 
      { 
       Console.WriteLine(grid[i][j]); 
       Console.ReadLine(); 
      } 
     } 
    } 
+0

Похоже, вы также можете удалить второй цикл над 'lines' и просто иметь' for' непосредственно после назначения 'grid [i]'. –

2

Не хватит ли кода ниже, его короче и предотвращает копирование всего файла в память перед преобразованием в массив.

var grid = File.ReadLines("duom.txt") 
    .Select(line => line.Split(' ').Select(item => double.Parse).ToArray()) 
    .ToArray(); 

foreach(var item in grid.SelectMany(row => row)) 
{ 
    Console.WriteLine(item); 
} 
0

Возможно, мне что-то не хватает, но это Split(',') выглядит теневым. Я не вижу ',' в вашем примере. Попробуйте вместо Split(' ')!

+0

Также решение @Jodrell выглядит лучше, чем петля – neleus

+0

не стесняйтесь проголосовать. – Jodrell

0

Спасибо всем за помощь, но мне удалось исправить сам, вот решение:

int h = 0; 
     int g = 0; 
     string linijos = File.ReadAllText("duom.txt"); 
     double[][] nuskait = new double[150][]; 
     foreach (var row in linijos.Split('\n')) 
     { 
      h = 0; 
      nuskait[g] = new double[4]; 
      foreach (var col in row.Trim().Split(' ')) 
      { 
       nuskait[g][h] = double.Parse(col); 
       h++; 
      } 
     } 
     g++;