Existe-t-il un bon moyen de lire, d'éditer et d'écrire des fichiers en place en Ruby ?
Dans mes recherches en ligne, j'ai trouvé des trucs suggérant de tout lire dans un tableau, de modifier ce tableau, puis d'écrire le tout. J'ai l'impression qu'il devrait y avoir une meilleure solution, surtout si j'ai affaire à un très gros fichier.
Quelque chose comme :
myfile = File.open("path/to/file.txt", "r+")
myfile.each do |line|
myfile.replace_puts('blah') if line =~ /myregex/
end
myfile.close
Où replace_puts
écrirait sur la ligne en cours, au lieu de (sur)écrire sur la ligne suivante comme il le fait actuellement parce que le pointeur se trouve à la fin de la ligne (après le séparateur).
Ainsi, chaque ligne qui correspond à /myregex/
sera remplacé par "blah". Évidemment, ce que j'ai en tête est un peu plus complexe que cela, en ce qui concerne le traitement, et se ferait en une seule ligne, mais l'idée est la même - je veux lire un fichier ligne par ligne, et modifier certaines lignes, et écrire quand j'ai fini.
Peut-être y a-t-il un moyen de dire "rembobinez jusqu'à la fin du dernier séparateur" ? Ou une façon d'utiliser each_with_index
et écrire via un numéro d'index de ligne ? Je n'ai rien trouvé de tel.
La meilleure solution que j'ai trouvée jusqu'à présent est de lire les données ligne par ligne, de les écrire dans un nouveau fichier (temporaire) ligne par ligne (éventuellement modifié), puis d'écraser l'ancien fichier avec le nouveau fichier temporaire et de l'effacer. Encore une fois, j'ai l'impression qu'il devrait y avoir un meilleur moyen - je ne pense pas que je devrais avoir à créer un nouveau fichier d'un gigaoctet juste pour éditer quelques lignes dans un fichier existant d'un gigaoctet.