プログラムは,人がやるには苦痛を伴う単調な作業を正確に素早く行ってくれます.機械的に測定した実験データなどは,決まった処理を繰り返し行わなければならないことがあります.このような処理が,プログラムは大変得意です. ここではRubyプログラムの便利さの一端を感じるため,「カンマで区切られた数値の,各行の平均値を取って出力する」という極簡単な処理を行ってみます. * プログラムの名前 [#i293bd44] 名前は結構重要です.できれば何をするか分かる名前を付けましょう.ここでつくるプログラムは,各行の平均値をとるので「row_average.rb」という名前にしておきます.プログラムはコマンドラインで row_average.rb infile とすれば実行できるようにします.「infile」というのは,入力データを含んだテキストファイル名を仮に表しています.実行時,実際のファイル名に置き換えてください. * データの流れ [#z90239dc] データ処理を行うので,まずどんなデータを入力して,どんなデータを出力するかをハッキリさせておきます.以下のような入出力を想定します. ** 入力データ [#w9fbe378] 256.3 ,258.6,256.9 122,222, 222,223 ... 何かの測定値がカンマで区切られています.区切りの量はいつも同じとは限りません.しかも,カンマの前後に半角スペースがある場合もあります. ** 出力データ [#p7e3c99c] 1, 254 2, 343 ... 行番号と,行の平均値をカンマで区切って出力します. * コーディング [#p0f04cd2] いくつかのステップに分けてプログラムを完成させて行きます. ** ステップ1 [#i4ad32df] まず,入力ファイルを各行ごとに取得するようにします.Rubyではgetsから標準入力,または第一引数の内容を得ることができます. #!/usr/bin/env ruby while line = gets p line end ** ステップ2 [#v8384dda] カンマで区切る,という動作を加えます.STRING.split()メソッドを使います. #!/usr/bin/env ruby while line = gets p line.split(",") end ** ステップ3 [#q1ba9feb] 余分な空白も取り除くようにします. #!/usr/bin/env ruby while line = gets p line.gsub(/\s/, "").split(",") end ** ステップ4 [#ya2fbf1d] 取り出した値 #!/usr/bin/env ruby while line = gets line.gsub(/\s/, "").split(",").each{|x| p x } end ** ステップ5 [#uc3f538c] #!/usr/bin/env ruby while line = gets line.chomp! sum = 0.0; i = 0 line.gsub(/\s/, "").split(",").each{|x| sum += x.to_f i += 1 } printf("%.2f\r\n", sum/i) end