- 追加された行はこの色です。
- 削除された行はこの色です。
プログラムは,人がやるには苦痛を伴う単調な作業を正確に素早く行ってくれます.機械的に測定した実験データなどは,決まった処理を繰り返し行わなければならないことがあります.このような処理が,プログラムは大変得意です.
ここでは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
line.chomp!
p line
end
chomp!メソッドは,文字列末尾の改行文字を破壊的に削るものです.上の書き方はRubyでフィルタ系のコマンドをつくる場合のイディオムのようなもので,覚えておいて損はないと思います.
** ステップ2 [#v8384dda]
カンマで区切る,という動作を加えます.STRING.split()メソッドを使います.
#!/usr/bin/env ruby
while line = gets
line.chomp!
p line.split(",")
end
** ステップ3 [#q1ba9feb]
余分な空白も取り除くようにします.
#!/usr/bin/env ruby
while line = gets
line.chomp!
p line.gsub(/\s/, "").split(",")
end
** ステップ4 [#ya2fbf1d]
取り出した値
#!/usr/bin/env ruby
while line = gets
line.chomp!
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