プロが教えるわが家の防犯対策術!

rubyによる文字列の置換でちょっと困っています。
例えば
text = "ABCDABCEFG"
という文字列があったとします。
その中の"ABC"の部分を"あいう"と置き換える場合
text = text.gsub(/ABC/, "あいう")

text = "あいうDあいうEFG"
と置換できるはずです。

以上のような操作は問題ないのですが
置換対象と置換後の文字列を以下のように定義して
subに放り込むということは出来ないのでしょうか。

置換前文字列:mae = "ABC"
置換後文字列:ato = "あいう"
text = text.gsub(/mae/, ato)
でもこれだと置換対象が"mae"という
文字列になってしまいますよね・・・

そもそもこのような機能はrubyにはないのでしょうか。
でも無いとかなり不便だと思いますが・・・

現在何十万行のcsvファイルを数千行の置換文字列対応表
をつかっていっぺんに処理しようとしまして
以上のような方法をとろうとして詰まっています。
どなたか詳しい方ご教授よろしくお願いします。

A 回答 (2件)

以下のような感じで。


#{}によるvariable interpolation を使ってもいいですけど
こっちの方が良いと思います。


#!ruby -Ks

text = "ABCDABCEFG"
mae = "ABC"
#mae = Regexp.compile("ABC")
ato = "あいう"

r = text.gsub(mae){ ato }
puts "置換前 = #{text}"
puts "置換後 = #{r}"

実行結果:
置換前 = ABCDABCEFG
置換後 = あいうDあいうEFG

この回答への補足

迅速な回答ありがとうございます。
さっそく以上の方法を使ってみたのですが
やはりうまく置換できません・・・
ちょっと説明不足だったので作業内容をもうちょっと詳しく書きます。

以下のような置換文字列一覧のcsvファイルがあります。
A,あ
I,い
U,う
これを読み込んで英語と読みの文字列が入った配列を作ります。
英語の配列 eng (eng[0]="A" eng[1]="B" eng[2]="C")
読みの配列 yomi (yomi[0]="あ" yomi[1]="い" yomi[2]="う")

この対応をgsubを使って英語の文字列を日本語に直す、
という操作をやろうとしています。
mae=eng[0]
ato=yomi[0]
として先ほど教えていただいたとおりにあるtextを
text=text(mae){ato}
としてみたのですがうまくいきません。
なお文字コードはすべてeucに統一しています。
どこがまずいのでしょうか・・・ご教授お願いします。

補足日時:2007/09/27 14:40
    • good
    • 0

単に「うまくいかない」ではなく、できるだけ小さな、


どこでも現象を再現できるスクリプトとデータを提示してください。
でないと余計なやり取りが増えることになります。

#ruby -Ks
eng = Array.new()
yomi = Array.new()
DATA.each do |line|
puts line #デバッグ用
fields = line.chomp.split(',')
eng << fields[0]
yomi << fields[1]
end

p eng #この2行はデバッグ用
p yomi

text = "ABCDABCEFG"

puts "置換前:#{text}"
text = text.gsub(eng[0]){yomi[0]}
puts "置換後:#{text}"

__END__
A,あ
I,い
U,う

A,あ
I,い
U,う
["A", "I", "U"]
["\202\240", "\202\242", "\202\244"]
置換前:ABCDABCEFG
置換後:あBCDあBCEFG

euc-jpでもやりましたが、問題なしです。

> ご教授お願いします。
「教示」です。
    • good
    • 0
この回答へのお礼

rubyを触り始めてまだ1週間もたってないもので
漠然とした質問になってしまって申しわけありませんでした。

以上の方法で今度はうまくいきました。
ありがとうございました。

お礼日時:2007/09/27 15:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!