我有一个使用ruby的标准StringScanner编写的解析器。如果我可以在流文件上使用它会很好。是否有一个与StringScanner等效的东西,不需要我将整个字符串加载到内存中?
答案 0 :(得分:1)
您可能需要稍微修改一下解析器,但是您可以将文件中的行提供给扫描程序,如下所示:
File.open('filepath.txt', 'r') do |file|
scanner = StringScanner.new(file.readline)
until file.eof?
scanner.scan(/whatever/)
scanner << file.readline
end
end
答案 1 :(得分:0)
StringScanner 的目的是为了加载一个大字符串并使用内部指针前后移动,如果你使它成为一个流,那么引用会丢失,你不能使用 unscan , check_until , pre_match , post_match , 你可以,但为此你需要缓冲所有以前的输入。
如果您关注缓冲区大小,那么只需加载大量数据,并使用简单的正则表达式或名为 Parser 的gem。 最简单的方法是读取数据的修复大小。
# 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)强>
将正在扫描的字符串更改为str并重置扫描仪。 返回str
答案 2 :(得分:-1)
有StringIO。
抱歉误读了你的问题。看看this似乎有流媒体选项