プログラムは,人がやるには苦痛を伴う単調な作業を正確に素早く行ってくれます.機械的に測定した実験データなどは,決まった処理を繰り返し行わなければならないことがあります.このような処理が,プログラムは大変得意です.
ここではRubyプログラムの便利さの一端を感じるため,「カンマで区切られた数値の,各行の平均値を取って出力する」という極簡単な処理を行ってみます.
名前は結構重要です.できれば何をするか分かる名前を付けましょう.ここでつくるプログラムは,各行の平均値をとるので「row_average.rb」という名前にしておきます.プログラムはコマンドラインで
row_average.rb infile
とすれば実行できるようにします.「infile」というのは,入力データを含んだテキストファイル名を仮に表しています.実行時,実際のファイル名に置き換えてください.
データ処理を行うので,まずどんなデータを入力して,どんなデータを出力するかをハッキリさせておきます.以下のような入出力を想定します.
256.3 ,258.6,256.9 122,222, 222,223 ...
何かの測定値がカンマで区切られています.区切りの量はいつも同じとは限りません.しかも,カンマの前後に半角スペースがある場合もあります.
1, 254 2, 343 ...
行番号と,行の平均値をカンマで区切って出力します.
いくつかのステップに分けてプログラムを完成させて行きます.
まず,入力ファイルを各行ごとに取得するようにします.Rubyではgetsから標準入力,または第一引数の内容を得ることができます.
#!/usr/bin/env ruby while line = gets line.chomp! p line end
chomp!メソッドは,文字列末尾の改行文字を破壊的に削るものです.上の書き方はRubyでフィルタ系のコマンドをつくる場合のイディオムのようなもので,覚えておいて損はないと思います.
カンマで区切る,という動作を加えます.STRING.split()メソッドを使います.
#!/usr/bin/env ruby while line = gets line.chomp! p line.split(",") end
余分な空白も取り除くようにします.
#!/usr/bin/env ruby while line = gets line.chomp! p line.gsub(/\s/, "").split(",") end
取り出した値
#!/usr/bin/env ruby while line = gets line.chomp! line.gsub(/\s/, "").split(",").each{|x| p x } end
#!/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