2012-04-01 4 views
2

午後!Ruby経由でファイル内の複数の単語を検索して置換する

Rubyの新機能で、Rubyの基本的な検索と置換機能をコーディングしたいと思っています。 この関数を呼び出すと、パラメータを渡すことができます(検索パターン、単語の置き換え)。

これは、このように動作します:multiedit(パターン1、replacement1、パターン2、replacement2、...)

は今、私は私の関数は、テキストファイルを読み取るパターン1を検索し、replacement2と交換し、検索したいですpattern2を置き換えてreplacement2に置き換えます。最後に、変更されたテキストを別のテキストファイルに書き込む必要があります。

私はuntilループでこれを実行しようとしましたが、次のパターンはすべて無視されますが、最初のパターンだけが置き換えられます(この例ではappleのみが果物に置き換えられます)。私は問題は、私はいつもオリジナルの変更されていないテキストを再読することだと思いますか?しかし、私は解決策を見つけることができません。手伝って頂けますか?私がそれをやっているように機能を呼び出すことは私のために重要です。

def multiedit(*_patterns) 

    return puts "Number of search patterns does not match number of replacement strings!" if (_patterns.length % 2 > 0) 

    f = File.open("1.txt", "r") 
    g = File.open("2.txt", "w") 

    i = 0 

    until i >= _patterns.length do 
    f.each_line {|line| 
     output = line.sub(_patterns[i], _patterns[i+1]) 
     g.puts output 
    } 
    i+=2 
    end 

    f.close 
    g.close 

end 

multiedit("apple", "fruit", "tomato", "veggie", "steak", "meat") 

私を助けてくれますか?

ありがとうございます!

よろしく

答えて

5

あなたのループは一種の裏返しだった...代わりにこれを行う...

f.each_line do |line| 
    _patterns.each_slice 2 do |a, b| 
     line.sub! a, b 
    end 
    g.puts line 
    end 
+0

これは私が探していたものです。私は古いルビーバージョンを実行しているので、必要な '列挙子'を追加する必要がありましたが、今は正確に何をすべきですか。 お返事ありがとうございます。 –

3

おそらく、すべての行のすべてのパターンを評価するための最も効率的な方法を構築することですすべての検索パターンから、単一の正規表現と方法は、ERBを使用することで簡単かつより良いString#gsub

def multiedit *patterns 
    raise ArgumentError, "Number of search patterns does not match number of replacement strings!" if (_patterns.length % 2 != 0) 

    replacements = Hash[ *patterns ]. 
    regexp = Regexp.new replacements.keys.map {|k| Regexp.quote(k) }.join('|') 

    File.open("2.txt", "w") do |out| 
    IO.foreach("1.txt") do |line| 
     out.puts line.gsub regexp, replacements 
    end 
    end 
end 
+0

また、私の問題を解決するための非常に興味深いアプローチ。 gsubは実際に非常に便利です。将来はもっと頻繁に使用します。 お寄せいただきありがとうございます。 –

関連する問題