2015-04-04 2 views
2

В настоящее время я пытаюсь прочитать файл с 200 + столбцами и 1000 + строками. Я использую следующий код:Чтение в очень больших файлах в Golang

var result []string 

file, err := os.Open("t8.txt") 
if (err != nil) { 
    fmt.Println(err) 
} 
defer file.Close() 
scan := bufio.NewScanner(file) 
for scan.Scan() { 
    result = append(result, scan.Text()) 

} 


fmt.Println(scan.Err()) //token too long 

Однако, когда я распечатать результаты, все это я получаю это первая линия, потому что он говорит, что маркер слишком долго. Когда я пытаюсь использовать файлы меньшего размера, он работает нормально. Есть ли способ в Голанге, который я мог бы сканировать в больших файлах?

+4

** Никогда ** игнорируйте значения ошибки 'error'! (Оба из 'os.Open' и проверка' scan.Err() 'после цикла также). –

+0

Я не знал, что у них есть scan.Err(), но теперь я вижу, что он возвращает «токен слишком долго». – freetoplay

+0

Когда я все равно хочу прочитать весь файл, иногда я просто использую ['syscall.Mmap'] (http://golang.org/pkg/syscall/#Mmap), например [здесь] (http: // stackoverflow. ком/а/28592330/2714852). – twotwotwo

ответ

5

Как уже указывалось на C @ Dave в комментариях вы работаете в MaxScanTokenSize = 64 * 1024

Чтобы обойти это ограничение, используйте bufio.Reader, который имеет метод ReadString (DELIM байт), который представляется целесообразным для вашего дела.

Из сканера идут документ (в частности, последнее предложение):

Сканер обеспечивает удобный интерфейс для чтения данных, таких как файл новой строки с разделителями строк текста. Последовательные вызовы метода Scan будут проходить через «токены» файла, пропуская байты между токенами. Спецификация маркера определяется разделенной функцией типа SplitFunc; функция разделения по умолчанию разрывает вход в линии с отключением линии. Функции разделения - это , определенные в этом пакете для сканирования файла в строки, байты, Руны с кодировкой UTF-8 и слова с разделителями-ограничителями. Клиент может вместо этого предоставить пользовательскую функцию разделения.

Сканирование останавливается неустранимо при EOF, первой ошибке ввода-вывода или токене слишком велико, чтобы вписаться в буфер. Когда сканирование останавливается, читатель может иметь , продвинутый сколь угодно далеко за последний токен. Программы, которым требуется больше , управляют обработкой ошибок или большими токенами или должны запускаться последовательно сканирует на считыватель, вместо этого следует использовать bufio.Reader.

Смежные вопросы