2010-03-16 63 views
5

我有一個使用ruby的標準StringScanner編寫的解析器。如果我可以在流式文件上使用它會很好。是否有一個等同於StringScanner,不需要我將整個字符串加載到內存中?StringScanner掃描IO而不是字符串

回答

-1

有StringIO。

很抱歉誤讀你的問題。看看this似乎已經流選項

+0

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

+0

抱歉誤讀你的問題。看看http://tinyurl.com/ydrq8o8似乎有流選項。 – nightshade427 2010-03-17 15:49:12

1

您可能需要返工解析器了一點,但你可以從文件中進料管這樣的掃描儀:

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

0

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