2013-07-14 24 views
5

テキストファイルから特定の行を削除するにはどうすればよいですか?たとえば、3行目、または他の行。私はこれを試しました:テキストファイルの特定の行を削除しますか?

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

「インプレース」とは何ですか? – bugerrorbug

+1

既存のファイル(インプレースアップデート)を変更するか、新しいファイルを作成することができます。この最後のアプローチは、非破壊的であるため一般的に好まれます。オプション '-i'の有無にかかわらず' sed'の例を確認してください。 – tokland

答えて

8

ファイルシステムの制限のために安全に行うことはできないと思います。

インプレイス編集を実際にやりたいのであれば、それをメモリに書き込んで編集してから、古いファイルを置き換えることができます。しかし、このアプローチには少なくとも2つの問題があることに注意してください。まず、書き換えの途中でプログラムが停止すると、不完全なファイルが取得されます。第二に、あなたのファイルが大きすぎる場合、それはあなたの記憶を食べるでしょう。

これらの線に沿って何かが動作するはず
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?' for main:Object ... "という理由で"? "のため。なぜか教えてくれますか? – bugerrorbug

+0

申し訳ありません、ライン_to_remove?慰謝のための条件になっていた、私はそれに応じて答えを更新します – 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 –

関連する問題