2013-10-25 2 views
0

Я использую C# в консольном приложении.Загрузка данных в 2D-массив из текстового файла?

Мне нужно загрузить данные из текстового файла и загрузить его в массив 2d.

Это то, что я пробовал, но когда я пытаюсь распечатать содержимое того, что возвращается, ничего не печатается.

public static int[,] LoadMap() 
{ 
    const string path = @"1.txt"; 

    string[] fileLines = File.ReadAllLines(path); 
    int[,] map = new int[fileLines.Length, 15]; 
    string line; 
    for (int i = 0; i < fileLines.Length; ++i) 
    { 
     line = fileLines[i]; 
     for (int j = 0; j < line.Length; ++j) 
     { 
      map[i, j] = (int)(line[j] - '0'); 
     } 
    } 

    return map; 
} 

Но когда я жестко кодирую данные, тогда все будет отображаться отлично.

private static int[,] Map = new int[MapX, MapY] 
{ 
      { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 
      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 
      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 
      { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 
      { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 
      { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 
      { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 
      { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 
      { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 
      { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 
      { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 
      { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 
      { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 
      { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 
      { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} 
}; 

данные в текстовом файле выглядит следующим образом:

0,0,0,1,1,1,1,1,1,1,1,1,1,1,1 
0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 
0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 
1,0,0,0,0,0,0,0,0,0,0,0,0,0,1 
1,0,0,0,0,0,0,0,0,0,0,0,0,0,1 
1,0,0,0,0,0,0,0,0,0,0,0,0,0,1 
1,0,0,0,0,0,0,0,0,0,0,0,0,0,1 
1,0,0,0,0,0,0,0,0,0,0,0,0,0,1 
1,0,0,0,0,0,0,0,0,0,0,0,0,0,1 
1,0,0,0,0,0,0,0,0,0,0,0,0,0,1 
1,0,0,0,0,0,0,0,0,0,0,0,0,0,1 
1,0,0,0,0,0,0,0,0,0,0,0,0,0,1 
1,0,0,0,0,0,0,0,0,0,0,0,0,0,1 
1,0,0,0,0,0,0,0,0,0,0,0,0,0,1 
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 

Любая помощь будет оценена исправить ли вы, что я пытался или предложить что-то совершенно другое, спасибо.

ответ

0

Вы можете использовать LINQ для разбора строки:

var lines = File.ReadAllLines(path); 
int[,] map = new int[fileLines.Length, 25]; 
for (int i = 0; i < fileLines.Length; ++i) 
{ 
    var data = lines[i].Split(',').Select(c => Convert.ToInt32(c)).ToList(); 
    for(int j =0; j<25; ++j) 
     map[i,j] = data[j]; 
} 
return map; 

Если бы вы могли использовать зазубренный массив вместо 2D массива, это становится проще:

public static int[][] LoadMap() 
{ 
    return File.ReadLines(path) 
      .Select(l => l.Split(',').Select(Convert.ToInt32).ToArray()) 
      .ToArray(); 
} 
+0

Спасибо Рид, я использую первый код, который вы предложили и изменил его немного теперь он отлично работает! – Marc

0

Если текстовый файл имеет запятые отделяя значения, замените эту строку:

for (int j = 0; j < line.Length; ++j) 

с:

for (int j = 0; j < line.Length; j += 2) 

Это означает, что ваши значения всегда будут иметь длину всего 1 символ.

2
string[] fileLines = File.ReadAllLines(path); 
     int[,] map = new int[fileLines.Length,fileLines[0].Split(',').Length]; 
     for (int i = 0; i < fileLines.Length; ++i) 
     { 
      string line = fileLines[i]; 
      for (int j = 0; j < map.GetLength(1); ++j) 
      { 
       string[] split = line.Split(','); 
       map[i, j] = Convert.ToInt32(split[j]); 
      } 
     } 
     return map; 
    } 
0

Когда данные поступают из текстового файла. Если он разделен запятой, вы можете отделить его, используя string.split. Затем вы загружаете то, что получаете в массив, и получаете доступ к нему, как обычно, для массива. Как показано ниже:

string[] lines = System.IO.File.ReadAllLines(@"path"); 
    foreach (string line in lines) 
    { 
     string[] first= line.Split(comma); 
    } 
Смежные вопросы