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
Ruby tiene un método para esto:
File.readlines(''foo'').each do |line|
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 .