• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ファイルの中の特定の行だけを削除したい)

ファイルの特定行を削除する方法

このQ&Aのポイント
  • ファイルの中の特定の行を削除する方法について教えてください。
  • あるファイルの特定の行を高速に削除する方法を知りたいです。
  • ファイルの特定行を削除する際、高速な方法があれば教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10361)
回答No.1

メモリに入りきる大きさならお書きの方法が一番良いと思います。ただ、配列にする必要はないで、 xxx = "hoge\n" out = "" IO.foreach("file") do |line| out << line if line != xxx end open("file","w") do |f| f.write out end 最初に削除する行が、ファイルのかなりうしろの方であることがわかっているなら、その位置(tell)を覚えておいて、書くときに"r+"でオープンしてその位置にseekしてから残りを書くとそこまでを書かない分だけ速いですが。closeしてから、縮まったサイズにtruncateする必要もあります。

inuchokin
質問者

お礼

ありがとうございます! 配列にする必要はないのですね。 <<で文字列に追加できるとは思ってませんでした。 テキストファイルで、それほど大規模ではないはずなので、メモリ範囲ないだろうと想定できます。 なので、こちらのプログラムを参考にさせていただきます! ありがとうございました。

その他の回答 (2)

  • ki073
  • ベストアンサー率77% (491/634)
回答No.3

No2です。 プログラムが間違っていますね。 if line != "hoge\n" then print line を fo.print line if line != "hoge\n" に修正 ついでに速度を測ってみたのですが(都合で正規表現での一致を見ています) まず手元に有った48709行(3.2MBytes)のファイルで 質問欄のプログラム 0.07秒 No.2のRuby(修正あり) 0.08秒 No.2のgrep 0.02秒 差がほとんど無かったので、2922540行に増やして 質問欄のプログラム 5.83秒 No.2のRuby(修正あり) 4.26秒 No.2のgrep 1.74秒 CPUはCore i5 1.6GHz、ストレージはSSDでRuby 1.8.7です。 grepは確かに速いですが、 質問欄のプログラムも結構速いと思いますが、

inuchokin
質問者

お礼

測定までしていただいて、ありがとうございました! SSDとはいえ、とても参考になりました。 今回はNo1さんの例を参考にさせていただくことにします。 また機会があれば宜しくお願いします。 ありがとうございました

  • ki073
  • ベストアンサー率77% (491/634)
回答No.2

一番速そうなのはRubyではなくgrepを使うことのように思います。 grep -v -E "^hoge$" infile >outfile Rubyほど正規表現は強力ではないので、単純な場合には使えます。 -vで一致したものが除外されます。 Rubyですが、arr<<line が遅くしていると思います。溜め込まずに一行ずつ出力すれば速くなるはずです。 溜め込んだ場合行数が多くなるとちょっとしんどいと思います。 fi = open("infile") fo=open("outfile", "w") f.each{|line| if line != "hoge\n" then print line } fi.close fo.close 後で出力ファイル名を変更します。 動作確認はしていません。

inuchokin
質問者

お礼

すみません。Rubyであるのは理由があるので変更できません。 このプログラムは他のプログラムの一部を構成しているにすぎないのです。 一時的に他のプログラム(例えばgrep)を呼び出すのも可能かもしれませんが、複雑化しそうなので今回はやめておきます。 もしかしたらするかもしれませんが・・・w やはり配列に貯めこむのは重そうですね。 しかしその例だと、ファイルが2つ存在しています。 ファイルは同一なのです。 ファイルをコピーするのはそのファイルが大規模であればあるほど重くなると思うので、やめておきます。 ありがとうございました。

関連するQ&A