StringScanner сканирует ввод-вывод вместо строки - PullRequest
5 голосов
/ 17 марта 2010

У меня есть парсер, написанный с использованием стандартного StringScanner в ruby. Было бы хорошо, если бы я мог использовать его для потоковой передачи файлов. Есть ли эквивалент StringScanner, который не требует от меня загрузки всей строки в память?

Ответы [ 3 ]

1 голос
/ 17 марта 2010

Возможно, вам придется немного переделать ваш синтаксический анализатор, но вы можете передавать строки из файла на сканер следующим образом:

File.open('filepath.txt', 'r') do |file|
  scanner = StringScanner.new(file.readline)
  until file.eof?
    scanner.scan(/whatever/)
    scanner << file.readline
  end
end
0 голосов
/ 06 октября 2017

StringScanner предназначался для того, чтобы загружать большую строку и переходить туда-сюда с внутренним указателем, если вы делаете это потоком, то ссылки теряются, вы не можете использовать unscan , check_until , pre_match , post_match , ну, вы можете, но для этого вам нужно буферизовать все предыдущие входные данные.

Если вас беспокоит размер буфера, просто загрузите по фрагменту данных и используйте простое регулярное выражение или гем под названием Parser . Самый простой способ - прочитать данные фиксированного размера.

# iterate over fixed length records
open("fixed-record-file") do |f|
  while record = f.read(1024)
    # parse here the record using regexp or parser
  end
end

[Обновлено]

Даже с этим циклом вы можете использовать StringSanner , вам просто нужно обновить строку с каждым новым фрагментом данных:

строка = (строка)

Изменяет сканируемую строку на str и сбрасывает сканер. Возвращает стр

0 голосов
/ 17 марта 2010

Есть StringIO.

Извините, неправильно прочитал ваш вопрос. Взгляните на у этого , кажется, есть опции потоковой передачи

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