StringScanner扫描IO而不是字符串

问题描述:

我有一个使用ruby的标准StringScanner编写的解析器。如果我可以在流式文件上使用它会很好。是否有一个等同于StringScanner,不需要我将整个字符串加载到内存中?StringScanner扫描IO而不是字符串

有StringIO。

很抱歉误读你的问题。看看this似乎已经流选项

+0

这与我所需要的相反! – jes5199 2010-03-17 04:33:14

+0

抱歉误读你的问题。看看http://tinyurl.com/ydrq8o8似乎有流选项。 – nightshade427 2010-03-17 15:49:12

您可能需要返工解析器了一点,但你可以从文件中进料管这样的扫描仪:

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意为此,加载大串并来回一个内部的指针,如果你把它流,则引用迷路时,你不能使用unscancheck_untilpre_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