2009-02-14 4 views
7

Ho un INPUT file che ha il seguente contenuto:Come convertire i contenuti STDIN in un array?

123\n 
456\n 
789 

voglio correre il mio script in questo modo: script.rb < INPUT e farlo convertire il contenuto del file di input a un array, dividendo il carattere della nuova riga. Quindi, vorrei avere qualcosa come myArray = [123,456,789]. Ecco quello che ho cercato di fare e non sto avendo molta fortuna:

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

mi aspetto questo per stampare 3, ma sto ottenendo 15. Sono molto confuso qui. Qualche indicazione?

+0

oy vey. La terza riga in realtà dice myArray.size. Errore nella domanda, non nel codice. – miketaylr

+0

@Mike: modifica la domanda ... – womble

risposta

20

Volete

myArray = $stdin.readlines 

che otterrà tutte $ standard input in un array con ingresso un array per riga di input.

Si noti che questo è spettacolarmente inefficiente (memoria saggio) con grandi file di input, così sei molto meglio usare qualcosa di simile:

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

invece di

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

perché il primo doesn allocare memoria per tutto in anticipo. Prova a elaborare un file di registro multi-gigabyte il secondo modo per vedere quanto è buono il rendimento dello swap del tuo sistema ... < grin>

1

ciò che stai dopo è utilizzando$stdin invece di $ stdin.to_s

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

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

STDIN.lines è pigro, ma ti offre una struttura a forma di matrice per passare in giro e iterare al di sopra di.