[logaling-commit] logaling/logaling-command [import-gene95] Add gene95 dictionary importer

Back to archive index

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を見てみると一気にデー
タを読み込む機能しかないみたいなのでガッと全部読み込んじゃっ
てもよいのかもしれません。。。




More information about the logaling-commit mailing list
Back to archive index