Ruby StringScanner扫描IO而不是字符串

Ruby StringScanner扫描IO而不是字符串,ruby,io,Ruby,Io,我已经用ruby的标准StringScanner编写了一个解析器。如果我能在流媒体文件上使用它,那就太好了。是否有一个等效于StringScanner的程序,它不需要我将整个字符串加载到内存中?有StringIO 对不起,误读了你的问题。看一看似乎有流式处理选项您可能需要稍微修改一下解析器,但您可以像这样将文件中的行馈送到扫描仪: File.open('filepath.txt', 'r') do |file| scanner = StringScanner.new(file.readlin

我已经用ruby的标准StringScanner编写了一个解析器。如果我能在流媒体文件上使用它,那就太好了。是否有一个等效于StringScanner的程序,它不需要我将整个字符串加载到内存中?

有StringIO


对不起,误读了你的问题。看一看似乎有流式处理选项

您可能需要稍微修改一下解析器,但您可以像这样将文件中的行馈送到扫描仪:

File.open('filepath.txt', 'r') do |file|
  scanner = StringScanner.new(file.readline)
  until file.eof?
    scanner.scan(/whatever/)
    scanner << file.readline
  end
end
File.open('filepath.txt',r')do | File|
scanner=StringScanner.new(file.readline)
直到file.eof?
scanner.scan(/whatever/)

scannerStringScanner就是为了这样,加载一个大字符串并使用一个内部指针来回移动,如果将其设置为流,那么引用就会丢失,不能使用unscan、check\u-until、pre\u-match、post\u-match、, 当然可以,但为此,需要缓冲所有以前的输入

如果您关心缓冲区大小,那么只需按数据块加载,并使用一个简单的regexp或一个名为的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,只需使用每个新数据块更新字符串:

string=(str)

将正在扫描的字符串更改为str并重置扫描仪。 返回str


这与我需要的正好相反!对不起,误读了你的问题。看一看,似乎有流媒体选项。我知道这是几年后,但仍然读取到内存中的整个文件。一旦到达eof,“扫描仪”将保存文件的完整副本。。。(在字符串指针移过内容之后,它不会释放任何内容)对解析器gem的引用(这是不相关的,因为解析器是Ruby解析器(在Ruby中)。