StringScanner扫描IO而不是字符串
问题描述:
我有一个使用ruby的标准StringScanner编写的解析器。如果我可以在流式文件上使用它会很好。是否有一个等同于StringScanner,不需要我将整个字符串加载到内存中?StringScanner扫描IO而不是字符串
答
您可能需要返工解析器了一点,但你可以从文件中进料管这样的扫描仪:
File.open('filepath.txt', 'r') do |file|
scanner = StringScanner.new(file.readline)
until file.eof?
scanner.scan(/whatever/)
scanner << file.readline
end
end
+3
我知道这是几年后,但仍然将整个文件读入内存。一旦你到达eof,“scanner”就会保存文件的完整副本......(在字符串指针移过内容后,它不会释放任何内容) – 2013-08-09 20:39:16
答
StringScanner意为此,加载大串并来回一个内部的指针,如果你把它流,则引用迷路时,你不能使用unscan,check_until,pre_match,后_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)
将正在扫描的字符串更改为str并重置扫描仪。 退货str
这与我所需要的相反! – jes5199 2010-03-17 04:33:14
抱歉误读你的问题。看看http://tinyurl.com/ydrq8o8似乎有流选项。 – nightshade427 2010-03-17 15:49:12