• ベストアンサー

Ruby ファイル出力について

あるファイルを一行づつ処理したものを、別のbuta.txtというファイルに書き出したいのですが、どうも上手くできません・・・。 誰か助けてください。お願いします。 ■かけるデータの内容■ banana banana ■プログラム■ file_name = ARGV.shift i = open(file_name) z = open("buta.txt", "w") while line = i.gets line.gsub(/a/, "A") line.sub(/a/, "A") ※ここに何かいれる?? end ■buta.txtの内容■ bAnAnA bAnana         になったらいいのですが。

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

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

#2です。 出力が4行になるのは、入力2行に対してeachのループで2回まわって、ループの中で z << を2回しているからです。 ちょっと質問を誤解していました。ファイルの1行目をgsubして2行目をsubと別々の処理をしたいんですね。 open('buta.txt','w') { |z| z << ARRF.gets.gsub(/a/,'A') z << ARRF.gets.sub(/a/,'A') } >Rubyは文字処理にむいてるのですかね・・。 オブジェクト指向開発をしないなら、PerlもRubyも出来ることはあまり変わらないと思います。 >Perlの方が慣れてしまっているので、 「PerlユーザーのためのRuby入門」という本があります。

Chiaki---
質問者

お礼

お返事ありがとうございました。

その他の回答 (2)

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

#1の方のやりかたでも出来ると思いますが、特殊変数 $_ に頼るのはRubyらしくないです。 open('buta.txt','w') { |z| ARGF.each {|line| z << line.gsub(/a/,'A') } } ARGF で引数で指定したファイルを読めます。複数ファイルを指定してもOKです。 元のプログラムをあまり変えないとすると、 file_name = ARGV.shift i = open(file_name) z = open("buta.txt", "w") while line = i.gets z.puts line.gsub(/a/, "A").sub(/a/,"A") end ただし、gsubの後に同じ内容のsubをするのは意味無いですが。

Chiaki---
質問者

補足

お返事ありがとうございます。 また、新たに質問なのですが、 open('buta.txt','w') { |z| ARGF.each {|line| z << line.gsub(/a/,'A') z << line.gsub(/c/,'C') } } とした場合、出力結果が bAbababa babababa bAbababa babababa となるのですが、どうしても4行出力されてしまいます。どうしてですか??(かけるデータ内容はさっきと同じ) Rubyはまだ今月から始めたばかりなので、わからない所だらけで困ってます。Rubyは文字処理にむいてるのですかね・・。Perlの方が慣れてしまっているので、なかなかつかめません・・・。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

質問で想定されてる入力と出力だけを考えるなら、こんな感じ; open( ARGV.shift ) do |i| open( 'buta.txt', 'w' ) do |z| i.gets; gsub! /a/, 'A'; z.print; i.gets; sub! /a/, 'A'; z.print; end end 上記スクリプトは、 ・メソッドopenのブロック構文 ・メソッドgetsとメソッドprintの使い方 ・特殊変数$_とメソッドgets、メソッドprintの関係 ・副作用付きのsub!と通常のsubの違い ――について判っていれば、読み解けると思います。

Chiaki---
質問者

お礼

お返事ありがとうございます。 さっそくやった所できました。また何かあった時はよろしくお願いします。

関連するQ&A