Разбор матрицы из файла в Go - PullRequest
1 голос
/ 24 ноября 2011

У меня есть файл со следующим содержимым:

 1  2  3  4  5
 6  0  0  0  7
 8  0  0  0  9
10  0  0  0 11
12 13 14 15 16

Мне нужен многомерный массив (или срез) [][]int. Я попытался поиграться с библиотекой scanner.Scanner:

scan.Init(f) // f is a file
scan.Whitespace = 1<<'\t' | 1<<'\r' | 1<<' '
tok := scan.Scan()
for tok != scanner.EOF {
    // do something with tok
    if tok == scanner.String {
        fmt.Print("\n")
    } else if tok == scanner.Int {
        // Handle int value
        // How do I get the matched token value?
    }       

    tok = scan.Scan()
}

Я не могу найти способ получить значение токена, который был сопоставлен.

Итак, два вопроса:

  1. Как получить значение любого отсканированного токена?
  2. Как я могу динамически создать этот двумерный срез / массив, прежде чем узнать его точный размер? (может быть любого размера на самом деле)

Ответы [ 2 ]

2 голосов
/ 24 ноября 2011

Объявление 1: Scanner.TokenText

Объявление 2: вкратце - если значения dims выводятся из текстового представления, внутренний цикл: добавление к срезу строки (скажем, [] int) до разрыва строки -> num из mx cols. Внешний цикл: Добавьте эти строки (к [] [] int) до EOF -> nm из mx строк.

1 голос
/ 24 ноября 2011

Я бы не использовал пакет сканера (который подходит для анализа контекстно-свободных грамматик, аналогично языку Go) для такой простой задачи чтения чисел из файла.Я бы использовал:

Как динамически создать этот двумерный срез / массив, прежде чем узнать его точный размер?(может быть любого размера)

Вы не можете.Либо прочитайте файл дважды, чтобы узнать точный размер вашего второго прохода, либо просто используйте append для динамического изменения размера основного массива среза.Многократный вызов append() также приводит к изменению поведения O (n), так что это не должно быть проблемой.

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