2009-02-14 7 views
7

Ich habe eine Datei INPUT bekomme, die folgenden Inhalte hat:Wie konvertiert man STDIN-Inhalte in ein Array?

123\n 
456\n 
789 

Ich mag meinen Skript ausgeführt werden soll, wie so: script.rb < INPUT und habe es den Inhalt der Eingabedatei in ein Array umwandeln, Aufteilen auf das neue Zeilenzeichen. Also, ich hätte etwas wie myArray = [123,456,789]. Hier ist, was ich versucht habe zu tun und habe nicht viel Glück:

myArray = STDIN.to_s 
myArray.split(/\n/) 
puts field.size 

ich dies erwartet 3 zu drucken, aber ich bin immer 15. Ich wirklich hier bin verwirrt. Irgendwelche Zeiger?

+0

oy vey. Die dritte Zeile sagt eigentlich puts myArray.size. Tippfehler in der Frage, nicht der Code. – miketaylr

+0

@Mike: Bearbeiten Sie die Frage ... – womble

Antwort

20

Sie wollen

myArray = $stdin.readlines 

Das wird alles von $ erhalten stdin in ein Array mit einem Array-Eintrag pro Eingabezeile.

Beachten Sie, dass diese spektakuläre Weise ineffizient ist (Speicher weist) mit großen Input-Dateien, so dass Sie viel besser sind weg mit so etwas wie:

$stdin.each_line do |l| 
    ... 
end 

statt

a = $stdin.readlines 
a.each do |l| 
    ... 
end 

Da die ehemaligen doesn Speicher für alles im Voraus nicht reservieren. Versuchen Sie, eine Multi-Gigabyte-Protokolldatei auf die zweite Weise zu verarbeiten, um zu sehen, wie gut die Swap-Leistung Ihres Systems ist. < grins>

1

Was ist Ihr sind nach heißt mit$stdin statt stdin.to_s $

ruby -e 'p $stdin.readlines.size' < INPUT 
3 

ruby -e 'p $stdin.to_s' 
"#<IO:0x7fc7cc578af0>" 
1

STDIN.lines ist faul, gibt Ihnen aber eine arrayähnliche Struktur zum Durchlaufen und Iterieren Über.

Verwandte Themen