- 締切済み
rubyのsub、gsubを使った文字列の置換について
rubyによる文字列の置換でちょっと困っています。 例えば text = "ABCDABCEFG" という文字列があったとします。 その中の"ABC"の部分を"あいう"と置き換える場合 text = text.gsub(/ABC/, "あいう") で text = "あいうDあいうEFG" と置換できるはずです。 以上のような操作は問題ないのですが 置換対象と置換後の文字列を以下のように定義して subに放り込むということは出来ないのでしょうか。 置換前文字列:mae = "ABC" 置換後文字列:ato = "あいう" text = text.gsub(/mae/, ato) でもこれだと置換対象が"mae"という 文字列になってしまいますよね・・・ そもそもこのような機能はrubyにはないのでしょうか。 でも無いとかなり不便だと思いますが・・・ 現在何十万行のcsvファイルを数千行の置換文字列対応表 をつかっていっぺんに処理しようとしまして 以上のような方法をとろうとして詰まっています。 どなたか詳しい方ご教授よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- sakusaker7
- ベストアンサー率62% (800/1280)
単に「うまくいかない」ではなく、できるだけ小さな、 どこでも現象を再現できるスクリプトとデータを提示してください。 でないと余計なやり取りが増えることになります。 #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でもやりましたが、問題なしです。 > ご教授お願いします。 「教示」です。
- sakusaker7
- ベストアンサー率62% (800/1280)
以下のような感じで。 #{}による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に統一しています。 どこがまずいのでしょうか・・・ご教授お願いします。
お礼
rubyを触り始めてまだ1週間もたってないもので 漠然とした質問になってしまって申しわけありませんでした。 以上の方法で今度はうまくいきました。 ありがとうございました。