StringScanner扫描IO而不是字符串

时间:2010-03-16 23:59:38

标签: ruby io

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

3 个答案:

答案 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似乎有流媒体选项