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

easydb.rb について

easydb.rb は何のために作ったかというと、表形式のデータをRubyのオブジェクトに変換して、データの処理を対話的に行いたいと思ったからだ。

表形式のデータというと、表計算のデータや、リレーショナルデータベースを思い浮かべやすいが、テストの成績処理や実験のデータなどデータ数は多くないがいろいろな切り口から眺めたり、非定型的な処理を行いたい場合がある。

こういうデータの扱いはいちいちプログラムするのは面倒だし、できれば統一的な入力方法で、処理も対話的にできたほうがうれしい。

easydb.rb のデータファイルの大本はコンマ区切りのフラットデータベースのテキストファイルだ。その冒頭に、データをオブジェクトに変換するためのフォーマットとデータを全部表示するためのラベルを追加している。

コンマ区切りのフラットデータベースを文字列の配列の配列にするのは簡単にできる。それを、フォーマットを使うことで文字列の配列を、数値データに変えたり、ハッシュに変換したりできる。たとえば、

apple,red
bnana,yello

のようなフラットファイルは最初に [['apple','red'],['bana','yellow'], ... ] という文字列の配列の配列として読み込まれるが、フラットファイルの冒頭で、

{:fruit=>x[0], :color=>x[1]}

と記述することによって、[{:fruit=>'apple', :color=>'red'}, ... ] というハッシュの配列に変換することができる。したがって、おなじような発想で、

123, 456
789, 100

のようなフラットファイルは [x[0].to_i, x[1].to_i] というフォーマットを冒頭に記述することによって、 [[123, 456], [789, 100], ... ] という数値の配列の配列に変換することができる。このように、フォーマットの書き方を工夫することでほとんどの表形式のデータのオブジェクト化に対応できる。

データファイルの2行目は、スペース区切りの文字列を記入する。たとえば 

fruit color

とかかれている場合、[{:fruit=>'apple', :color=>'red'}, ... ] のような配列のハッシュの形式のデータを表示する時のデフォールトのラベルを指定している。Hash#keys メソッドで取得できそうだが、この方法ではラベルの順序が定義したときと変わってしまう。

次の実行例は、aminoacid.txt というデータベースを読み込み、全データを表示し、特定のラベルのデータのみを表示し、表の行数を表示し、略号のアルファベット順でソートし、条件に一致したデータを表示している。これらは全てRubyの命令を利用して行うので、特別なプログラムは必要ない。

>ruby easydb.rb
easydb> table, all = read('aminoacid.txt')
easydb> table.dump(all)
easydb> puts all
easydb> table.dump('name polarity')
easydb> puts table.size
easydb> table.sort{|x,y| x[:let1] >=> y[:let1]}.dump(all)
easydb> table.select{|x| x[:acidity] =~ /acidic/}.dump(all)
easydb> exit

easydb は表形式のフラットファイルをオブジェクト変換する以外のことはやっていない。データをどう活用するかはユーザ次第だが、それをRubyを対話的に扱うだけで行えるのだ。

easydb.rb の対話処理を行う部分は minirb からの流用だ。したがって、一行の式を実行するだけでなく、; と ;の間に複数の行からなるプログラムを入力することができる。

要するに、easydb.rb がやっているのはフラットファイルのオブジェクト化だけなので、どういうオブジェクトを作って、どういう処理をするのかはユーザが全てRubyで管理できるのだ。

このエントリーが、きちんとしたマニュアルになっているか自信がないが、いろいろ詳しい説明を読むよりもサンプルの aminoacid.txt を使っていろいろいじってみたほうが簡単だろう。
by tnomura9 | 2008-09-15 00:42 | Ruby | Comments(0)
<< easydb.rb で成績処理 Rubyで表計算 その5 簡単... >>