Gibt es eine gute Möglichkeit, Dateien in Ruby zu lesen, zu bearbeiten und zu schreiben?Lesen, bearbeiten und schreiben Sie eine Textdatei zeilenweise mit Ruby
In meiner Online-Suche habe ich Sachen gefunden, die vorschlagen, alles in ein Array zu lesen, das Array zu modifizieren und dann alles zu schreiben. Ich habe das Gefühl, dass es eine bessere Lösung geben sollte, besonders wenn es sich um eine sehr große Datei handelt.
Etwas wie:
myfile = File.open("path/to/file.txt", "r+")
myfile.each do |line|
myfile.replace_puts('blah') if line =~ /myregex/
end
myfile.close
Wo replace_puts
würde die aktuelle Zeile schreiben über, anstatt (über) das Schreiben der nächsten Zeile, wie es gegenwärtig der Fall ist, weil der Zeiger am Ende der Leitung ist (nach dem Trenn).
Also wird dann jede Zeile die mit /myregex/
übereinstimmt mit "blah" ersetzt. Offensichtlich ist das, was ich vorhabe, etwas komplizierter als das, was die Verarbeitung angeht, und würde in einer Zeile erfolgen, aber die Idee ist die gleiche - ich möchte eine Datei Zeile für Zeile lesen und bestimmte Zeilen bearbeiten, und Schreibe auf, wenn ich fertig bin.
Vielleicht gibt es eine Möglichkeit, einfach zu sagen "zurückspulen bis kurz nach dem letzten Trennzeichen"? Oder eine Möglichkeit, each_with_index
zu verwenden und über eine Zeilenindexnummer zu schreiben? Ich konnte jedoch nichts dergleichen finden.
Die beste Lösung, die ich bisher habe, ist es, Dinge zeilenweise zu lesen, sie in eine neue (temporäre) Datei auszugeben (möglicherweise bearbeitet), dann die alte Datei mit der neuen temporären Datei zu überschreiben und zu löschen. Nochmals, ich habe das Gefühl, dass es einen besseren Weg geben sollte - ich denke nicht, dass ich eine neue 1gig-Datei erstellen müsste, nur um einige Zeilen in einer bestehenden 1-GB-Datei zu bearbeiten.
Betrachten Sie die Ergebnisse, wenn Ihr Code zu lesen und überschreiben dann während des Prozesses fehlschlagen: Sie laufen Gefahr, die Datei zu zerstören. –
Okay, als Folgefrage: Von der Kommandozeile aus können Sie das tun: ruby -pe "gsub (/ blah /, 'newstuff')" whatev.txt. Das macht, was ich tun möchte, aber ich möchte es nicht auf der Kommandozeile so machen, ich möchte es in etwas Größeres einfügen. Kann mir jemand intern sagen, was dieser Befehl macht, der die Illusion gibt, eine Datei Zeile für Zeile zu bearbeiten? Wird in eine temporäre Datei geschrieben oder werden Arrays verwendet? Weil es ziemlich schnell auf ziemlich großen Dateien zu funktionieren scheint, mehr als die hier angebotenen Vorschläge. – Hsiu
Das ist eine gute Frage. Könnten Sie bitte eine neue Frage stellen? Das macht es viel einfacher für andere, es zu sehen und zu beantworten.Wenn diese Frage zu Ihrer Zufriedenheit beantwortet wurde, können Sie diese Antwort auch akzeptieren? Vielen Dank! –