#!/usr/local/bin/ruby18 -Ku # -*- coding: utf-8 -*- ############################### # Author: vagus # LastUpdate: 2010-6-15 # 無保証、無制限(改変、再配布 etc) ############################### # Modified by G-HAL(fenix.ne.jp) # Tue,15 Jun,2010 - Fri,18 Jun,2010 # Tue,31 Aug,2010 ############################### # # JIGYOSYO.CSV から各種 IME 用郵便番号辞書の基となる zipcode.base を作成する # (事前に jigyosyo.lzh を落として伸張しておくこと) # % wget http://www.post.japanpost.jp/zipcode/dl/kogaki/lzh/jigyosyo.lzh # % lha xg jigyosyo.lzh # ############################### # 既知の問題: # ・文字列でソートするから数字部分の並びがおかしい # # (JIGYOSYO.CSV は一部、第3水準の漢字を使っていて、EUC-JP に変換できないので # 入れない。) # ############################### require 'kconv' require 'iconv' if 1 <= ARGV.size IN_FILE = ARGV[0] else IN_FILE = "./JIGYOSYO.CSV" end if 2 <= ARGV.size OUT_FILE = ARGV[1] else OUT_FILE = "./zipcode_jigyousyo_base.txt" end #******************************************** # 数字の全角/半角を相互に置換する関数 #******************************************** def num_tr(str, to_full_or_half) fw = %w[ 0 1 2 3 4 5 6 7 8 9 ] hw = %w[ 0 1 2 3 4 5 6 7 8 9 ] case to_full_or_half when "half" tr_tbl = Hash[*fw.zip(hw).flatten] str.gsub(/[#{fw.join}]/u){ tr_tbl[$&] } when "full" tr_tbl = Hash[*hw.zip(fw).flatten] str.gsub(/[#{hw.join}]/u){ tr_tbl[$&] } else $stderr.puts "#{to_full_or_half}"': Invalid value. Only "full" or "half" are available.' exit(1) end end #******************************************** # 「種市第46地割~第49地割」みたいなのを # ["種市第46地割", "種市第47地割", "種市第48地割", "種市第49地割"] # に展開する関数 #******************************************** def expand_range(str) str = num_tr(str, "half") str.match(/^([^0-9]+)([0-9]+)[^0-9]+([0-9]+)([^0-9]+)/u) ($2.to_i..$3.to_i).map{|x| "#{$1}#{num_tr(x.to_s, "full")}#{$4}" } end #-------------------------------------------- # JIGYOSYO.CSV を読んで必要な field を抜き出す #-------------------------------------------- ken_all_src = [] open(IN_FILE, "r"){|f| # f_utf8 = NKF.nkf("-Sw -x", f.read).gsub('"','') f_utf8 = Iconv.conv("UTF-8", "CP932", f.read).gsub('"','') ken_all_src = f_utf8.map{|line| e =line.chomp.split(",") [e[7], e[3], e[4..6].join, e[2]] } } #----------------------------------------- # 複数行にまたがっている奴を一行にまとめる #----------------------------------------- ken_all = [] ken_all_src.each{|item| item_tmp = [item[3]] item_tmp.each{|y| ken_all << [item[0], " #CNS ", item[1], item[2], " " + y] } } #----------------------------- # 英数記号を半角にした候補を追加 #----------------------------- hankaku = [] ken_all.each{|item| hw2_hit = false hw3_hit = false if item[3] =~ /./ hw_item2 = NKF.nkf("-Ww -Z", num_tr(item[3], "half")) if hw_item2 =~ /[[:alnum:]()]/u hw2_hit = true else hw_item2 = item[3] end end if item[4] =~ /./ hw_item3 = NKF.nkf("-Ww -Z", num_tr(item[4], "half")) if hw_item3 =~ /[[:alnum:]()]/u hw3_hit = true else hw_item3 = item[4] end end if hw2_hit || hw3_hit hankaku << [item[0], item[1], item[2], hw_item2, hw_item3] end } ken_all += hankaku #----------------------------- # sort, uniq して成形して出力 #----------------------------- open(OUT_FILE, "w"){|f| ken_all.uniq.sort_by{|x| x }.each{|item| # f.puts NKF.nkf("-We", item.join(" ")) f.puts Iconv.conv("EUC-JP", "UTF-8", item.join("")) } } # [ End of File ]