2014-07-11 5 views
6

Aus irgendeinem Grund kann ich kein Tutorial finden, das erwähnt, wie man das macht ... Also, wie lese ich die ersten n Zeilen aus einer Datei?Ruby - wie man die ersten n Zeilen aus der Datei in das Array liest

Ich habe kommen mit:

while File.open('file.txt') and count <= 3 do |f| 
    ... 
    count += 1 
    end 
end 

aber es funktioniert nicht und es sieht auch nicht sehr nett zu mir.

Nur aus Neugier, habe ich versucht, Dinge wie:

File.open('file.txt').10.times do |f| 

aber das hat wirklich entweder nicht funktionieren.

Also gibt es eine einfache Möglichkeit, nur die ersten n Zeilen zu lesen, ohne die ganze Datei laden zu müssen? Vielen Dank!

Antwort

19

Hier ist eine einzeilige Lösung:

lines = File.foreach('file.txt').first(10) 

Ich war besorgt, dass es nicht die Datei in einer Eingabeaufforderung Weise schließen könnte (es kann nur die Datei schließen nachdem der Garbage Collector den von File.foreach zurückgegebenen Enumerator gelöscht hat). Allerdings habe ich strace und ich fand heraus, dass, wenn Sie File.foreach ohne einen Block aufrufen, gibt es einen Enumerator, und jedes Mal, wenn Sie die first Methode auf diesem Enumerator aufrufen, wird es die Datei öffnen, lesen Sie so viel wie es benötigt, und dann schließe die Datei. Das ist nett, weil es bedeutet, dass Sie die obige Codezeile verwenden können und Ruby die Datei nicht länger geöffnet hält als nötig.

+1

Ich war nicht vertraut mit IO :: foreach. Wie es einen Enumerator zurückgibt, der mit anderen Enumeratoren kombiniert werden kann, erlaubt die Verwendung von "next" und "peek", kann verwendet werden, um nur den Anfang einer Datei zu verarbeiten, wie Sie, usw., es sieht ziemlich nützlich aus. Ich verstehe deine Bedenken nicht, wenn ich nur aus einer Datei lese. Kannst du es ausarbeiten? –

+0

Ich habe meinen Test mit 'strace' gemacht und herausgefunden, dass alles in Ordnung ist. Ich machte mir nur Sorgen, dass Ruby den Dateigriff länger als nötig geöffnet lassen könnte, weil ich nicht sicher war, wie er es wissen würde, wenn der Benutzer Zeilen aus der Datei lesen würde und das Dateihandle für eine unvorhersehbare Zeit offen bleiben könnte verursachen schlechte Nebenwirkungen. –

5

Es gibt viele Möglichkeiten, wie Sie dieses Problem in Ruby angehen können. Hier ist eine Möglichkeit:

File.open('Gemfile') do |f| 
    lines = 10.times.map { f.readline } 
end 
+0

Sie können 'f.lineno' anstelle eines Zählers verwenden. – Jonathan

+0

@CarySwoveland, Ich habe meine Antwort basierend auf Ihrem Kommentar vereinfacht. – infused

+0

Schön, besser als das, was ich vorgeschlagen hatte ... –

3
File.foreach('file.txt').with_index do |line, i| 
    break if i >= 10 
    puts line 
end 
-1

könnten Sie versuchen, die folgenden:

`head -n 10 file`.split 

Es ist nicht wirklich „reinen Rubin“, aber das ist selten eine Forderung in diesen Tagen.

+0

Wartbarer Code ist immer eine Voraussetzung. –

Verwandte Themen