Existe-t-il un bon moyen de lire, de modifier et d'écrire des fichiers dans Ruby?Lire, modifier et écrire un fichier texte par ligne à l'aide de Ruby
Dans ma recherche en ligne, j'ai trouvé des trucs suggérant de tout lire dans un tableau, de modifier le tableau, puis de tout écrire. Je pense 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 actuelle, plutôt que (sur) écrire 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 correspondant à /myregex/
sera remplacée par «blah». Évidemment, ce que j'ai en tête est un peu plus compliqué que ça, en ce qui concerne le traitement, et ce serait fait en une ligne, mais l'idée est la même - je veux lire un fichier ligne par ligne et éditer certaines lignes, et écris quand j'ai fini.
Peut-être y a-t-il un moyen de dire simplement "revenir en arrière juste après le dernier séparateur"? Ou une certaine façon d'utiliser each_with_index
et écrire via un numéro d'index de ligne? Cependant, je n'ai rien trouvé de semblable. La meilleure solution que j'ai jusqu'à maintenant est de lire les choses par lignes, de les écrire dans un nouveau fichier (temporaire) par ligne (éventuellement modifié), puis d'écraser l'ancien fichier avec le nouveau fichier temporaire et de le supprimer. Encore une fois, je pense qu'il devrait y avoir un meilleur moyen - je ne pense pas que je devrais avoir à créer un nouveau fichier 1gig juste pour éditer quelques lignes dans un fichier existant de 1Go.
Considérez les résultats si votre code à lire puis écraser échouait en cours de processus: Vous courez le risque de détruire le fichier. –
Très bien, comme question de suivi: depuis la ligne de commande, vous pouvez faire ceci: ruby -pe "gsub (/ blah /, 'newstuff')" whatev.txt. Cela fait ce que je veux faire, mais je ne veux pas le faire sur la ligne de commande comme ça, je veux le mettre dans quelque chose de plus grand. Quelqu'un peut-il me dire, en interne, ce que fait cette commande qui donne l'illusion d'éditer un fichier, ligne par ligne? Est-ce qu'il écrit dans un fichier temporaire ou utilise des tableaux? Parce qu'il semble fonctionner assez rapidement sur des fichiers assez volumineux, à plus forte raison que les suggestions proposées jusqu'ici. – Hsiu
C'est une excellente question. Pourriez-vous s'il vous plaît en faire une nouvelle question? Cela rend beaucoup plus facile pour les autres de le voir et d'y répondre.En outre, si cette question a été répondue à votre satisfaction, pouvez-vous accepter cette réponse? Merci! –