#!/usr/local/bin/ruby19 -- # -*- encoding: utf-8 -*- ############################### # Author: vagus # LastUpdate: 2010-5-31 # 無保証、無制限(改変、再配布 etc) ############################### # Modified by G-HAL(fenix.ne.jp) # Tue,15 Jun,2010 - Fri,18 Jun,2010 # Tue,31 Aug,2010 ############################### # # JIGYOSYO.CSV から Anthy 用の zipcode.t を作成する # (事前に jigyosyo.lzh を落として伸張しておくこと) # http://www.post.japanpost.jp/zipcode/dl/kogaki/lzh/jigyosyo.lzh # ############################### # 既知の問題: # ・文字列でソートするから数字部分の並びがおかしい # # (JIGYOSYO.CSV は一部、第3水準の漢字を使っていて、EUC-JP に変換できないので # 入れない。) # ############################### 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 # 「種市第46地割~第49地割」みたいなのを # ["種市第46地割", "種市第47地割", "種市第48地割", "種市第49地割"] # に展開する関数 def expand_range(str) str = str.tr("[0-9]","[0-9]") str.match(/^([^0-9]+)([0-9]+)[^0-9]+([0-9]+)([^0-9]+)/) ($2.to_i..$3.to_i).map{|i| "#{$1}#{i.to_s.tr("[0-9]","[0-9]")}#{$4}" } end #-------------------------------------------- # JIGYOSYO.CSV を読んで必要な field を抜き出す #-------------------------------------------- ken_all_src = [] open(IN_FILE, "r:CP932"){|f| ken_all_src = f.read.encode("UTF-8")\ .gsub('"','')\ # 「???」はeucに変換できないので「−」に置換 .gsub('???','−')\ .gsub('─','−')\ # 「~」は変換マッピングの問題が有るので「〜」に置換 .gsub('~','〜')\ .each_line.map{|line| e =line.chomp.split(",") ["#{e[7]}", "#{e[3]}", "#{e[4]}#{e[5]}#{e[6]}", " #{e[2]}"] } } #----------------------------------------- # 複数行にまたがっている奴を一行にまとめる #----------------------------------------- ken_all = [] ken_all_src.each{|item| item_tmp = [item[3]] item_tmp.each{|y| ken_all << [item[0], item[1..2].join + y] } } #----------------------------- # 英数記号を半角にした候補を追加 #----------------------------- hankaku = [] ken_all.each{|item| if item[1] =~ /[−0-9A-Za-z()]/ hankaku << [item[0], item[1].tr("−0-9A-Za-z()", "-0-9A-Za-z()")] end } ken_all += hankaku #----------------------------- # sort, uniq して成形して出力 #----------------------------- open(OUT_FILE, "w"){|f| ken_all.uniq.sort{|x, y| [x[0], x[1]] <=> [y[0], y[1]] }.each{|x| f.puts "#{x[0]} #CNS #{x[1].encode('EUC-JP')}" } } # [ End of File ]