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

Ruby で表計算 その3

次のようなフラットファイルをフォーマットしてオブジェクトにするモジュールを作った。

ファイル名: names.txt

Ken, 24
Mary, 20
John, 31
Mary Ann, 3

次のファイル、flat.rb がそれだ。

ファイル名: flat.rb
module Flat
  def read(path, format)
    IO.read(path).split(/\n/).
    collect{|x| x.split(/,/)}.
    collect{|x| eval format}
  end
end

使い方は次のようにする。

irb を起動して、require 'flat' し、include Flat する。すると、Flat モジュールのフォーマッとつきフラットファイル読み込みメソッド read(path, format) が使えるようになる。path にはテキストファイルのパスの文字列、format にはフォーマットのためのコードブロックを表した文字列を割り当てる。format はread メソッドの定義の最後の collect ブロックの中で eval される。動作を文章で説明するのは難しいので下の実行例を実際に実行してもらうと簡単に分かると思う。

実行例

irb
irb(main):001:0> require 'flat'
=> true
irb(main):002:0> include Flat
=> Object
irb(main):003:0> read('names.txt', 'x')
=> [["Ken", " 24"], ["Mary", " 20"], ["John", " 31"], ["Mary Ann", " 3"]]
irb(main):004:0> read('names.txt', '{:name=>x[0], :age=>x[1]}')
=> [{:age=>" 24", :name=>"Ken"}, {:age=>" 20", :name=>"Mary"}, {:age=>" 31", :name=>"John"}, {:age=>" 3", :name=>"Mary Ann"}]
irb(main):005:0> read('names.txt', '[x[0], x[1].to_i]')
=> [["Ken", 24], ["Mary", 20], ["John", 31], ["Mary Ann", 3]]

したがって、次のように read の出力を、変数 table に代入すると、テキストファイル names.txt を読み出して、table オブジェクトにすることができる。

table = read('names.txt', '{:name=>x[0], :age=>x[1].to_i}')

いったん table オブジェクトさえできてしまえば、あとの処理はRubyのスクリプトで思い通りにできてしまう。
by tnomura9 | 2008-09-10 21:31 | Ruby | Comments(0)
<< Rubyで表計算 その4 アミ... Ruby で表計算 その2 >>