2013-07-14 13 views
5

Jak usunąć pojedynczą, określoną linię z pliku tekstowego? Na przykład trzeci wiersz lub dowolna inna linia. Próbowałem tego:Usunięcie konkretnej linii z pliku tekstowego?

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 

Niestety, nie robi nic. Próbowałem wielu innych rozwiązań, ale nic nie działa.

+0

musi być na miejscu? – tokland

+0

co masz na myśli przez "inplace"? – bugerrorbug

+1

Możesz zmodyfikować istniejący plik (to jest aktualizacja lokalna) lub utworzyć nowy. To ostatnie podejście jest na ogół preferowane, ponieważ nie jest niszczące. Sprawdź na przykład "sed" z opcją lub bez opcji "-i". – tokland

Odpowiedz

8

Myślę, że nie można zrobić tego bezpiecznie z powodu ograniczeń systemu plików.

Jeśli naprawdę chcesz wykonać edycję lokalną, możesz spróbować zapisać ją w pamięci, edytować, a następnie zamienić stary plik. Ale strzeż się, że z tym podejściem są co najmniej dwa problemy. Po pierwsze, jeśli program zostanie zatrzymany w trakcie przepisywania, otrzymasz niekompletny plik. Po drugie, jeśli twój plik jest zbyt duży, zjem pamięć.

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 

Coś wzdłuż tych linii powinny działać, ale przy użyciu pliku tymczasowego jest o wiele bezpieczniejsze, a średnia podejście

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) 

Twój stan może być cokolwiek, który pokazał, że to niepotrzebny wiersz, jak, file_lines += line unless line.chomp == "aaab" na przykład, usunie wiersz "aaab".

+0

Doceniam twoją pracę Doodad, ale żadne z twoich rozwiązań nie działa. Daje mi błąd "... nieokreślona metoda" line_to_remove? dla main: Object ... "ze względu na"? ". Czy możesz powiedzieć mi dlaczego? – bugerrorbug

+0

Przykro mi, line_to_remove? Miał być warunkiem remotionu, będę aktualizować odpowiedź odpowiednio – Doodad

+0

Wielkie dzięki! Twoje rozwiązanie naprawdę mi pomogło! Dzięki jeszcze raz! – 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

Nie rozumiem twojego rozwiązania, możesz to wyjaśnić? – bugerrorbug

+0

czy możesz dać mi przykład aktualizacji w miejscu? – bugerrorbug

+1

z http://stackoverflow.com/a/16638778/170881 –

Powiązane problemy