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

Rubyで表計算 その5 簡単データベース easydb.rb

アミノ酸データベースを改造して、テキストファイルからデータベースを取り込めるようにした。時間がないので詳しい説明は後で加筆予定。

ファイル名: easydb.rb (evalは半角英数に修正してください)

class Array
  def dump(label)
    format = 'print ' +
      label.split(/ /).collect{|x| 'x[:'+x+']'}.join('," ",') + ', "\n"'
    puts label
    self.each{|x| eval format}
  end
end

def read(path)
  data = IO.read(path).split(/\n/)
  format = data.shift
  label = data.shift
  raise 'format error' if format =~ /system|open/
  return data.collect{|x| x.split(/,/)}.collect{|x| eval format},
    label
end

def ml
  prog = ""
  while true
    print 'lines*> '
    line = gets
    break if line == ";\n"
    prog << line
  end
  return prog
end

loop do
  begin
    print "easydb> "
    line = gets
    if line == ";\n"
      then line = ml
    end
    eval(line, TOPLEVEL_BINDING)
  rescue SyntaxError, LoadError, StandardError
    STDERR.puts "Warning: #$!"
  end
end

取り込むデータベースはテキストファイルで最初の行にフォーマット、次の行にデフォールトで表示するときのラベル、その下にコンマ区切りのデータを記述する。つぎのファイルがその例だ。

ファイル名: aminoacid.txt

{:name=>x[0],:let3=>x[1],:let1=>x[2],:polarity=>x[3],:acidity=>x[4],
:hydropathy=>x[5]}
name let3 let1 polarity acidity hydropathy
Alanine      ,Ala,A,nonpolar,neutral         , 1.8
Arginine     ,Arg,R,polar   ,basic (strongly),-4.5
Asparagine   ,Asn,N,polar   ,neutral         ,-3.5
Aspartic acid,Asp,D,polar   ,acidic          ,-3.5
Cysteine     ,Cys,C,nonpolar,neutral         , 2.5
Glutamic acid,Glu,E,polar   ,acidic          ,-3.5
Glutamine    ,Gln,Q,polar   ,neutral         ,-3.5
Glycine      ,Gly,G,nonpolar,neutral         ,-0.4
Histidine    ,His,H,polar   ,basic (weakly)  ,-3.2
Isoleucine   ,Ile,I,nonpolar,neutral         , 4.5
Leucine      ,Leu,L,nonpolar,neutral         , 3.8
Lysine       ,Lys,K,polar   ,basic           ,-3.9
Methionine   ,Met,M,nonpolar,neutral         , 1.9
Phenylalanine,Phe,F,nonpolar,neutral         , 2.8
Proline      ,Pro,P,nonpolar,neutral         ,-1.6
Serine       ,Ser,S,polar   ,neutral         ,-0.8
Threonine    ,Thr,T,polar   ,neutral         ,-0.7
Tryptophan   ,Trp,W,nonpolar,neutral         ,-0.9
Tyrosine     ,Tyr,Y,polar   ,neutral         ,-1.3
Valine       ,Val,V,nonpolar,neutral         , 4.2

ブログの表示の制限でフォーマットが折り返して表示されているが、修正して一行にしておかないと動作しない。

実行例は次のようになる。表を読み込む read では、左辺にテーブルを格納する変数と、テーブルのデフォールトのラベルを格納する変数をおく。テーブルを表示する dump ではデフォールトのラベルがないので、このラベルを使うことに注意。あとは、アミノ酸データベースと同じように、テーブルオブジェクトをRuby の関数で自由に処理できる。

実行例

> ruby easydb.rb
easydb> table, all = read('aminoacid.txt')
easydb> table.dump(all)
......
easydb> table.select{|x| x[:polarity] =~ /^polar/}.dump(all)
......
easydb> ;
easydb> for i in 1..10
easydb> puts table[i][:name]
easydb> end
easydb> ;
......
by tnomura9 | 2008-09-12 19:25 | Ruby | Comments(0)
<< easydb.rb について Rubyで表計算 その4 アミ... >>