2012-10-16 17 views
9

Wie kann ich den "Zeiger" einer Datei auf den Anfang zurücksetzen, ohne sie erneut zu öffnen? (? So etwas wie fseek in C)Eine Datei in Ruby mehr als einmal lesen/greppen

Zum Beispiel habe ich eine Datei, die ich für zwei Muster grep will:

f=open('test') => #<File:test> 
f.grep(/llo/) => ["Hello world\n"] 
f.grep(/wo/) => [] 

Ist es möglich, die Datei zurückgesetzt f ohne erneuten Aufruf?

Hinweis: Ich suche keine Workarounds; Ich kann einiges selbst denken;).

Antwort

15

Verwenden rewind

ios Positionen an den Anfang des Eingangs, lineno auf Null zurückgesetzt wird.

4

Werfen Sie einen Blick auf die Ruby-Dokumentation für die IO Klasse. So setzen Sie den Strom:

f.pos = 0 

oder

f.seek 0 

Beachten Sie, dass Sie auch den Strom auf eine beliebige Byte-Position mit diesen Methoden setzen kann, aber vorsichtig sein, wenn die Datei Mehrbytezeichen enthält.

Tipp: File.ancestors wird Ihnen die Vererbungskette mitteilen, so dass Sie nach Methoden suchen können, die möglicherweise das erreichen, was Sie wollen (aber manchmal müssen Sie für die Singleton-Methoden und für die erweiterte method_missing).

UPDATE:

Megas' Antwort kann sauberer sein, weil rewind auch lineno zurücksetzt. grep Die Ausgabe wird nicht durch den Wert lineno beeinflusst, aber lineno wird immer ungenauer, es sei denn, es ist zurückgesetzt. Wenn Sie sich nicht um lineno kümmern, können Sie sicher eine unserer Lösungen verwenden.

Verwandte Themen