人気ブログランキング | 話題のタグを見る

easydb.rb で成績処理

easydb.rb で次のような架空の試験点数の成績処理をしてみた。

Ruby$ cat seiseki.txt
{:name=>x[0], :sugaku=>x[1].to_f, :kokugo=>x[2].to_f, :eigo=>x[3].to_f}
name sugaku kokugo eigo
A,90,65,55
B,46,50,50
C,63,63,58
D,50,40,48
E,55,32,40

(注 ブログの表示の関係で一行目の format が折り返しているが、コピペで使うときは一行にしておかないと動作しない)

実行例は次のようになる。

Ruby$ ruby easydb.rb
easydb> table, all = read('seiseki.txt')
easydb> table.dump(all)
A 90.0 65.0 55.0
B 46.0 50.0 50.0
C 63.0 63.0 58.0
D 50.0 40.0 48.0
E 55.0 32.0 40.0

テーブルに個人の総得点を追加する。

easydb> table.each{|x| x[:gokei] = x[:sugaku] + x[:kokugo] + x[:eigo]}
easydb> table.dump(all+' gokei')
A 90.0 65.0 55.0 210.0
B 46.0 50.0 50.0 146.0
C 63.0 63.0 58.0 184.0
D 50.0 40.0 48.0 138.0
E 55.0 32.0 40.0 127.0

ラベル all に総得点のラベル gokei を追加してデフォールトで表示するようにする。

easydb> all = all + ' gokei'

生徒を総得点の多い順にソートする。

easydb> table.sort{|x,y| y[:gokei] <=> x[:gokei]}.dump(all)
A 90.0 65.0 55.0 210.0
C 63.0 63.0 58.0 184.0
B 46.0 50.0 50.0 146.0
D 50.0 40.0 48.0 138.0
E 55.0 32.0 40.0 127.0

英語の最高点を検索する。

easydb> p table.collect{|x| x[:eigo]}.max
58.0

英語の最高点をとった生徒を検索する。

easydb> table.select{|x| x[:eigo] == 58.0}.dump(all)
C 63.0 63.0 58.0 184.0

総得点の最低点を検索する。

easydb> p table.collect{|x| x[:gokei]}.min
127.0

生徒の総得点の合計を計算し、変数 sum に入れる。

easydb> sum = table.inject(0.0){|s,x| s += x[:gokei]}
easydb> p sum
805.0

総得点の平均を計算し、変数 mean に入れる。

easydb> mean = sum / table.size.to_f
easydb> p mean
161.0

個人の総得点が mean 以上のものを検索する。

easydb> table.select{|x| x[:gokei] > mean}.dump(all)
A 90.0 65.0 55.0 210.0
C 63.0 63.0 58.0 184.0

数学の得点が国語の得点より多いものを検索する。

easydb> table.select{|x| x[:sugaku] > x[:kokugo]}.dump(all)
A 90.0 65.0 55.0 210.0
D 50.0 40.0 48.0 138.0
E 55.0 32.0 40.0 127.0

このくらいのことなら、Excel を使った方が速いのかもしれないが、思いつくままに Ruby の式でデータを処理していろいろな切り口で眺めるのはおもしろい。
by tnomura9 | 2008-09-15 09:20 | Ruby | Comments(0)
<< readline つき eas... easydb.rb について >>