lectura escritura cadenas archivos ruby line-endings

escritura - cadenas ruby



Cómo leer las líneas de un archivo en Ruby (8)

Estaba intentando usar el siguiente código para leer líneas de un archivo. Pero al leer un file , los contenidos están todos en una línea:

line_num=0 File.open(''xxx.txt'').each do |line| print "#{line_num += 1} #{line}" end

Pero este file imprime cada línea por separado.

Tengo que usar stdin, como ruby my_prog.rb < file.txt , donde no puedo asumir cuál es el carácter de final de línea que usa el archivo. ¿Cómo puedo manejarlo?


Creo que mi respuesta cubre sus nuevas inquietudes sobre el manejo de cualquier tipo de final de línea, ya que tanto "/r/n" como "/r" se convierten al estándar de Linux "/n" antes de analizar las líneas.

Para admitir el carácter "/r" EOL junto con el habitual "/n" y "/r/n" de Windows, esto es lo que haría:

line_num=0 text=File.open(''xxx.txt'').read text.gsub!(//r/n?/, "/n") text.each_line do |line| print "#{line_num += 1} #{line}" end

Por supuesto, esto podría ser una mala idea en archivos muy grandes, ya que significa cargar todo el archivo en la memoria.


Es debido a las líneas finales en cada línea. Use el método chomp en ruby ​​para eliminar la línea final ''/ n'' o ''r'' al final.

line_num=0 File.open(''xxx.txt'').each do |line| print "#{line_num += 1} #{line.chomp}" end


No olvide que si le preocupa leer en un archivo que podría tener grandes líneas que podrían inundar su RAM durante el tiempo de ejecución, siempre puede leer el archivo de la comida. Consulte " Por qué absorber un archivo es malo ".

File.open(''file_path'', ''rb'') do |io| while chunk = io.read(16 * 1024) do something_with_the chunk # like stream it across a network # or write it to another file: # other_io.write chunk end end



Soy parcial al siguiente enfoque para archivos que tienen encabezados:

File.open(file, "r") do |fh| header = fh.readline # Process the header while(line = fh.gets) != nil #do stuff end end

Esto le permite procesar una línea de encabezado (o líneas) de manera diferente a las líneas de contenido.


Su primer archivo tiene finales de línea Mac Classic (eso es "/r" lugar de los habituales "/n" ). Abrirlo con

File.open(''foo'').each(sep="/r") do |line|

para especificar los finales de línea.


que tal se gets ?

myFile=File.open("paths_to_file","r") while(line=myFile.gets) //do stuff with line end


File.foreach(filename).with_index do |line, line_num| puts "#{line_num}: #{line}" end

Esto ejecutará el bloque dado para cada línea en el archivo sin absorber todo el archivo en la memoria. Ver: IO::foreach .