2013-07-14 7 views
5

Wie kann ich eine einzelne, spezifische Zeile aus einer Textdatei löschen? Zum Beispiel die dritte Zeile oder eine andere Zeile. Ich habe es versucht:Eine bestimmte Zeile in einer Textdatei löschen?

line = 2 
file = File.open(filename, 'r+') 
file.each { last_line = file.pos unless file.eof? } 
file.seek(last_line, IO::SEEK_SET) 
file.close 

Leider tut es nichts. Ich habe viele andere Lösungen ausprobiert, aber nichts funktioniert.

+0

muss an Ort und Stelle sein? – tokland

+0

was meinst du mit "inplace"? – bugerrorbug

+1

Sie können entweder die vorhandene Datei (das ist ein direktes Update) ändern oder eine neue erstellen. Dieser letzte Ansatz wird im Allgemeinen bevorzugt, da er nicht destruktiv ist. Überprüfen Sie zum Beispiel 'sed' mit oder ohne die Option' -i'. – tokland

Antwort

8

Ich denke, Sie können das nicht sicher wegen Dateisystem Einschränkungen tun.

Wenn Sie wirklich eine Inplace-Bearbeitung durchführen möchten, könnten Sie versuchen, sie in den Speicher zu schreiben, sie zu bearbeiten und dann die alte Datei zu ersetzen. Aber Vorsicht, es gibt mindestens zwei Probleme mit diesem Ansatz. Erstens, wenn Ihr Programm mitten im Neuschreiben aufhört, erhalten Sie eine unvollständige Datei. Zweitens, wenn Ihre Datei zu groß ist, wird es Ihr Gedächtnis auffressen.

file_lines = '' 

IO.readlines(your_file).each do |line| 
    file_lines += line unless <put here your condition for removing the line> 
end 

<extra string manipulation to file_lines if you wanted> 

File.open(your_file, 'w') do |file| 
    file.puts file_lines 
end 

etwas in diese Richtung sollte funktionieren, aber eine temporäre Datei ist eine viel sicherere und die Standard-Ansatz

require 'fileutils' 

File.open(output_file, "w") do |out_file| 
    File.foreach(input_file) do |line| 
    out_file.puts line unless <put here your condition for removing the line> 
    end 
end 

FileUtils.mv(output_file, input_file) 

Ihr Zustand könnte alles sein, die zeigte, war es die unerwünschte Linie, wie, file_lines += line unless line.chomp == "aaab" würde zum Beispiel die Zeile "aaab" entfernen.

+0

Ich schätze, Sie arbeiten Doodad, aber keine Ihrer Lösungen arbeiten. Es gibt mir einen Fehler "... undefined Methode 'line_to_remove?' für main: Objekt ... "wegen dem"? ". Kannst du mir sagen warum? – bugerrorbug

+0

Es tut mir leid, line_to_remove? sollte eine Bedingung für die Remotion sein, werde ich die Antwort entsprechend aktualisieren – Doodad

+0

Vielen Dank! Deine Lösung hat mir wirklich geholfen! Danke noch einmal! – bugerrorbug

-2
file.each do |line| 
    if should_be_deleted(line) 
    f.seek(-line.length, IO::SEEK_CUR) 
    f.write(' ' * (line.length - 1)) 
    f.write("\n") 
    end 
end 
file.close 

File.new(filename).each {|line| p line } 
+0

Ich verstehe deine Lösung nicht, kannst du es erklären? – bugerrorbug

+0

Können Sie mir ein Inplace-Update-Beispiel geben? – bugerrorbug

+1

ist es von http://Stackoverflow.com/a/16638778/170881 –