2016-05-29 11 views
3
と仮定

、私は次のテキストで INPUT.TXTファイルがありますので、テキストファイルの特定の行を削除するには?

First line 
Third line 

First line 
Second line 
Third line 
Fourth line 

私はこれを取得するために、例えば、第二、第四行を削除したいのこのコードを使用して2行目の1行だけを削除することができました

require 'fileutils' 

File.open('output.txt', 'w') do |out_file| 
    File.foreach('input.txt') do |line| 
    out_file.puts line unless line =~ /Second/ 
    end 
end 

FileUtils.mv('output.txt', 'input.txt') 

muを削除する正しい方法は何ですかRubyのテキストファイルにある複数の行?

+0

あなたは何をしようとしていますか? –

+0

投稿したコードは、サンプル入力ファイルに表示されている行のうち、_any_は削除されません。私は、線を削除するためにどの基準を使用するかを明確にする必要があると思います。すべての偶数行を削除しますか?特定の文字列の数が多い行を削除しますか?私たちはあなたが投稿したものからはわかりません。 –

+0

@WayneConrad特定の文字列を含む行を削除するか、指定されたインデックスを持つ行だけを削除する方法を知りたい –

答えて

5

テキストファイルからきれいにかつ効率的に行を削除すると、一般的なケースでは「困難」ですが、多少の問題を制約することができればシンプルにすることができます。ここで

は、同様の質問をしてきたSOからいくつかの質問です:

が同様に、他の多くのものがあります。

入力ファイルが比較的小さい場合は、使用しているアプローチを簡単に使用する余裕があります。本当に、あなたの基準を満たすように変更する必要がある唯一のものは、あなたの入力ファイルのループと条件がこれに変更することです:

File.open('output.txt', 'w') do |out_file| 
    File.foreach('input.txt').with_index do |line,line_number| 
    out_file.puts line if line_number.even? # <== line numbers start at 0 
    end 
end 

変更が可能with_index方法を使用して、行番号をキャプチャしますFile#foreachはブロックなしで呼び出されたときにEnumeratorを返します。ブロックはwith_indexに適用され、2番目のブロック引数として行番号が取得されます。比較で行番号を使用するだけで、指定した条件が得られます。

このアプローチは、いくらか大きなファイルの場合でもスケールされますが、ファイル全体をメモリに読み込むソリューションでは、ファイルサイズの上限がかなり低くなります。このソリューションを使用すると、ファイルの読み書きが可能なディスクスペースとスピードがより制限されます。たとえば、スペース制限されたオンラインストレージにこれを行うと、あなたが望むだけではうまくいかない場合があります。利用可能なスペースがあると仮定して、ローカルディスクまたはサムドライブに書き込むことは、まったく問題ではありません。

3

File.readlinesを使用して、入力ファイルの行の配列を取得します。

input_lines = File.readlines('input.txt') 

次に、偶数インデックスのものだけを選択します。

output_lines = input_lines.select.with_index { |_, i| i.even? } 

最後に、それらを出力ファイルに書き込みます。

File.open('output.txt', 'w') do |f| 
    output_lines.each do |line| 
    f.write line 
    end 
end 
関連する問題