¿Hay alguna forma de leer, editar y escribir archivos en Ruby?Lea, edite y escriba un archivo de texto en línea con Ruby
En mi búsqueda en línea he encontrado cosas que sugieren leer todo en una matriz, modificar dicha matriz, luego escribir todo. Siento que debería haber una solución mejor, especialmente si estoy tratando con un archivo muy grande.
Algo así como:
myfile = File.open("path/to/file.txt", "r+")
myfile.each do |line|
myfile.replace_puts('blah') if line =~ /myregex/
end
myfile.close
Dónde replace_puts
escribiría sobre la línea actual, en lugar de (sobre) a escribir la siguiente línea como lo hace actualmente debido a que el puntero se encuentra al final de la línea (después del separador)
Por lo tanto, cada línea que coincida con /myregex/
será reemplazada por 'blah'. Obviamente, lo que tengo en mente es un poco más complicado que eso, en cuanto al procesamiento, y lo haría en una línea, pero la idea es la misma: quiero leer un archivo línea por línea y editar ciertas líneas, y escribir cuando termine.
¿Tal vez hay una manera de decir "volver a enrollar justo después del último separador"? O alguna forma de usar each_with_index
y escribir a través de un número de índice de línea? Aunque no pude encontrar nada por el estilo.
La mejor solución que tengo hasta ahora es leer cosas en línea, escribirlas en un nuevo archivo (temp) en línea (posiblemente editado), luego sobrescribir el archivo anterior con el nuevo archivo temporal y eliminarlo. De nuevo, creo que debería haber una mejor manera: no creo que deba crear un nuevo archivo 1gig solo para editar algunas líneas en un archivo de 1GB existente.
Considere los resultados si su código para leer y sobreescribir falla a mitad del proceso: corre el riesgo de destruir el archivo. –
Muy bien, como una pregunta de seguimiento: desde la línea de comandos, puede hacer esto: ruby -pe "gsub (/ blah /, 'newstuff')" whatev.txt. Eso hace lo que quiero hacer, pero no quiero hacerlo en la línea de comandos así, quiero ponerlo dentro de algo más grande. ¿Puede alguien decirme, internamente, qué está haciendo ese comando que da la ilusión de editar un archivo, línea por línea? ¿Está escribiendo en un archivo temporal o usando matrices? Porque parece funcionar en archivos bastante grandes con bastante rapidez, más que las sugerencias que aquí se ofrecen. – Hsiu
Esa es una gran pregunta. ¿Podría hacer una nueva pregunta? Eso hace que sea mucho más fácil para los demás verlo y responderlo.Además, si esta pregunta fue respondida a su satisfacción, ¿puede aceptar esa respuesta? ¡Gracias! –