2009-02-14 18 views
7

Tengo una entrada de archivo que tiene el siguiente contenido:¿Cómo convertir contenido STDIN a una matriz?

123\n 
456\n 
789 

Quiero correr mi script de este modo: script.rb < ENTRADA y tienen que convertir el contenido del archivo de entrada a una matriz, dividir en el nuevo carácter de línea. Entonces, tendría algo como myArray = [123,456,789]. Esto es lo que he tratado de hacer y no estoy teniendo mucha suerte:

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

Estoy esperando esta opción para imprimir 3, pero yo estoy 15. Estoy muy confundido aquí. ¿Alguna sugerencia?

+0

oy vey. La tercera línea realmente dice puts myArray.size. Typo en la pregunta, no el código. – miketaylr

+0

@Mike: edite la pregunta ... – womble

Respuesta

20

¿Quieres

myArray = $stdin.readlines 

que ponerlas todas $ entrada estándar en una matriz con la entrada de una matriz por línea de entrada.

Tenga en cuenta que esto es espectacularmente ineficaz (memoria del reloj) con grandes archivos de entrada, por lo que es mucho mejor usar algo como:

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

en lugar de

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

porque el primero doesn asignar memoria para todo por adelantado. Intente procesar un archivo de registro de varios gigabytes de la segunda manera para ver qué tan bueno es el rendimiento de intercambio de su sistema ... < grin>

1

Lo que su buscamos es usando$stdin en lugar de $ stdin.to_s

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

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

STDIN.lines es flojo, pero le ofrece una estructura tipo array para pasar e iterar encima.

Cuestiones relacionadas