2013-07-14 96 views
5

如何從文本文件中刪除單個特定行?例如第三行,或任何其他行。我試過這個:刪除文本文件中的特定行?

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 

不幸的是,它什麼也沒做。我嘗試了很多其他解決方案,但沒有任何工作。

+0

必須在哪裏? – tokland

+0

「inplace」是什麼意思? – bugerrorbug

+1

您可以修改現有文件(這是一個就地更新)或創建一個新文件。最後一種方法通常是首選,因爲它是非破壞性的。檢查例如'sed'是否帶有'-i'選項。 – tokland

回答

8

我想你不能安全地做到這一點,因爲文件系統的限制。

如果您真的想進行就地編輯,您可以嘗試將其寫入內存,編輯它,然後替換舊文件。但要小心這種方法至少有兩個問題。首先,如果程序在重寫過程中停止,您將得到一個不完整的文件。其次,如果你的文件太大,它會吃掉你的記憶。

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 

東西沿着這些線路應該工作,但使用臨時文件是一個更安全,標準的方法

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) 

你的條件可以是任何東西,表明它是不需要的行一樣,file_lines += line unless line.chomp == "aaab"例如,將刪除「aaab」這一行。

+0

我感謝你的工作Doodad,但沒有你的解決方案的工作。它給了我一個錯誤「...未定義的方法'line_to_remove?'對於main:Object ...「是因爲」?「。你能告訴我爲什麼嗎? – bugerrorbug

+0

對不起,line_to_remove?本來應該是一個條件的remotion,我會更新相應的答案 – Doodad

+0

非常感謝!你的解決方案真的幫助我!再次感謝! – 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

我不明白你的解決方案,你能解釋一下嗎? – bugerrorbug

+0

你能給我一個就地更新的例子嗎? – bugerrorbug

+1

它來自http://stackoverflow.com/a/16638778/170881 –