Ruby実用例 〜超簡単なデータ処理〜 のバックアップ(No.8)


プログラムは,人がやるには苦痛を伴う単調な作業を正確に素早く行ってくれます.機械的に測定した実験データなどは,決まった処理を繰り返し行わなければならないことがあります.このような処理が,プログラムは大変得意です.

ここではRubyプログラムの便利さの一端を感じるため,「カンマで区切られた数値の,各行の平均値を取って出力する」という極簡単な処理を行ってみます.

プログラムの名前

名前は結構重要です.できれば何をするか分かる名前を付けましょう.ここでつくるプログラムは,各行の平均値をとるので「row_average.rb」という名前にしておきます.プログラムはコマンドラインで

row_average.rb infile

とすれば実行できるようにします.「infile」というのは,入力データを含んだテキストファイル名を仮に表しています.実行時,実際のファイル名に置き換えてください.

データの流れ

データ処理を行うので,まずどんなデータを入力して,どんなデータを出力するかをハッキリさせておきます.以下のような入出力を想定します.

入力データ

256.3 ,258.6,256.9
122,222, 222,223
...

何かの測定値がカンマで区切られています.区切りの量はいつも同じとは限りません.しかも,カンマの前後に半角スペースがある場合もあります.

出力データ

1, 254
2, 343
...

行番号と,行の平均値をカンマで区切って出力します.

コーディング

いくつかのステップに分けてプログラムを完成させて行きます.

ステップ1

まず,入力ファイルを各行ごとに取得するようにします.Rubyではgetsから標準入力,または第一引数の内容を得ることができます.

#!/usr/bin/env ruby

while line = gets
  p line
end

ステップ2

カンマで区切る,という動作を加えます.STRING.split()メソッドを使います.

#!/usr/bin/env ruby

while line = gets
  p line.split(",")
end

ステップ3

余分な空白も取り除くようにします.

#!/usr/bin/env ruby

while line = gets
  p line.gsub(/\s/, "").split(",")
end

ステップ4

取り出した値

#!/usr/bin/env ruby

while line = gets
  line.gsub(/\s/, "").split(",").each{|x|
    p x
  }
end

ステップ5

#!/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
Valid XHTML 1.1! home >
トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Modified by 物理のかぎプロジェクト PukiWiki 1.4.5_1 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-jiPowered by PHP 5.3.29HTML convert time to 0.008 sec.