Kouhei Sutou
kou****@clear*****
Fri Jan 20 08:56:25 JST 2012
こ、これは! > SHIMADA Koji 2012-01-19 21:51:57 +0900 (Thu, 19 Jan 2012) > > New Revision: c2b70c48404a185ba3ced0f4125c3e7bc0c92f88 > > Log: > Add gene95 dictionary importer > =================================================================== > --- /dev/null > +++ lib/logaling/external_glossaries/gene95.rb 2012-01-19 21:51:57 +0900 (005f3cc) > @@ -0,0 +1,43 @@ > +# Copyright (C) 2011 Koji SHIMADA (2012だと思います。) > + CSV.generate(buffer) do |csv| > + puts "downloading gene95 dictionary..." > + Zlib::GzipReader.open(open('http://www.namazu.org/~tsuchiya/sdic/data/gene95.tar.gz')) do |gz| > + contents = false > + puts "importing gene95 dictionary..." tar.gzなのにungzipしただけでファイルを読んじゃうのは少し強引 かなぁと思いました。RubyGemsにtarを展開するコードが入ってい るはずなので、それをつかってtarも展開したほうがよいかと思い ました。(*.gemはtarフォーマットだから) > + gz.readlines.map{|l| l.encode("UTF-8", "CP932", undef: :replace, replace: '').strip }.each_slice(2) do |source, target| > + if contents > + csv << [ source.split(" ").map(&:strip)[0], target ] > + else > + contents = true > + end > + end gene.txtは2.6MBくらいなのであまり気にしなくてもよいのかもし れませんが。。。 readlinesすると一気に全部メモリ上にStringを作ってしまうので、 そこそこデータが大きくてストリーム的に処理できるデータフォー マットの場合は使わない方がいいかなぁと思いました。 代わりに ... innput.each_line.each_slice(2) do |source, target| source = prepare_line(source) target = prepare_line(target) ... end ... end def prepare_line(line) line.encode("UTF-8", "CP932").strip end みたいな風にも書けるかなぁと思います。 が、rubygems/package/tar_reader/entry.rbを見てみると一気にデー タを読み込む機能しかないみたいなのでガッと全部読み込んじゃっ てもよいのかもしれません。。。