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 и сбрасывает сканер.
Возвращает стр