2010-03-16 4 views
5

Ich habe einen Parser geschrieben mit Ruby's Standard StringScanner. Es wäre schön, wenn ich es beim Streaming von Dateien verwenden könnte. Gibt es eine Entsprechung zu StringScanner, bei der ich nicht die ganze Zeichenfolge in den Speicher laden muss?StringScanner Scannen IO statt einer Zeichenfolge

Antwort

-1

Es gibt StringIO.

Sorry falsch gelesene Frage. Streaming-Optionen einen Blick auf this scheint

+0

Das ist das Gegenteil von dem, was ich brauche! – jes5199

+0

Entschuldigung falsch gelesene Frage. Werfen Sie einen Blick auf http://tinyurl.com/ydrq8o8 scheint Streaming-Optionen zu haben. – nightshade427

1

Sie haben könnte Ihr Parser ein wenig zu überarbeiten, aber man kann so zu einem Scanner Zeilen aus einer Datei füttern:

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

Ich weiß, das ist Jahre später, aber das liest immer noch die ganze Datei in den Speicher. Sobald Sie eof erreicht haben, hält der "Scanner" die vollständige Kopie der Datei ... (Es wird nichts freigegeben, nachdem der Zeichenfolgenzeiger den Inhalt überschritten hat) –

0

StringScanner war beabsichtigt für das, eine große Zeichenfolge und hin und her mit einem internen Zeiger zu laden, wenn Sie es einen Strom zu machen, dann bekommen die Verweise verloren, Sie nicht unscan verwenden können, check_until, pre_match, Post _match, gut können Sie, aber dafür müssen Sie alle vorherigen Eingabe puffern.

Wenn Sie über die Puffergröße besorgt sind, dann laden Sie einfach nach Stück Daten und verwenden Sie eine einfache Regexp oder ein Juwel namens Parser. Der einfachste Weg ist das Lesen einer festen Größe von Daten.

# 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 

[aktualisiert]

Auch bei dieser Schleife Sie StringSanner verwenden können, man muss nur mit jedem neuen Teil der Daten die Zeichenfolge aktualisieren:

string = (str)

Ändert den zu scannenden String in str und setzt ihn zurück der Scanner. Versandkosten str

Verwandte Themen