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
Es gibt StringIO.
Sorry falsch gelesene Frage. Streaming-Optionen einen Blick auf this scheint
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
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) –
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
- 1. StringScanner entspricht einer Zeichenfolge, als wäre es eine Position zurück
- 2. Scannen Ordner für Dateien statt Array
- 3. NSScanner - Nächste Zeile in Zeichenfolge scannen
- 4. Scannen Sie eine Zeichenfolge weiter, bis sie das erste/letzte Vorkommen einer Zeichenfolge gefunden hat
- 5. Statt Druck, den Wert der gesamten der Zeichenfolge zurückkehrt statt
- 6. Scannen von einer Datei in C
- 7. Import-Csv aus Zeichenfolge statt aus einer Datei?
- 8. to_json kehrt Zeichenfolge statt json in Rails
- 9. nicht in der Lage, die Zeichenfolge mit Leerzeichen zu scannen
- 10. Scannen Sie eine Zeichenfolge mit Leerzeichen in C
- 11. Assembly Sprache Scannen lange Zeichenfolge für die Zählung der Vokale
- 12. Beinhaltet Socket IO Disk IO?
- 13. Haskell, wie IO IO Monad
- 14. Nach Zeichenfolge filtern statt in ActiveAdmin auswählen
- 15. Leere Zeichenfolge statt NULL-Werte Eloquent
- 16. Warum gibt es eine verschachtelte IO-Monade, IO (IO()), als Rückgabewert meiner Funktion?
- 17. Weblogic: Jersey-Scannen deaktivieren
- 18. Haskell Weg zu [IO String] in IO String
- 19. Mehrere Farbbalken statt einer
- 20. Winkel-socket-io io ist nicht
- 21. Eine Webseite mit Golang scannen
- 22. Wie konvertiere ich eine Zeichenfolge in eine Liste in Io?
- 23. SQL Server verwenden statt suchen scannen, wenn eine Fensterfunktion und Prädikat enthält eine Variable
- 24. Scannen einer Datei nach einer Signatur (mit fread)
- 25. Scannen mit Scanner aus einer Textdatei isst Ziffern einer Zahl?
- 26. Verwenden einer Monade in der IO-Monade
- 27. XAP für Dateien scannen
- 28. Guice + Klassenpfad Scannen
- 29. Haskell Monade: IO [Double] bis [IO Double]
- 30. Filter IO [Maybe String] zu IO [String]
Das ist das Gegenteil von dem, was ich brauche! – jes5199
Entschuldigung falsch gelesene Frage. Werfen Sie einen Blick auf http://tinyurl.com/ydrq8o8 scheint Streaming-Optionen zu haben. – nightshade427