読者です 読者をやめる 読者になる 読者になる

郵便番号データの悪夢

ken_all.csvという名前のファイルを見て目眩がする方は、友達になれそうです。

日本郵便が提供している郵便番号データは、データ構造としては最悪です。人間が見る分には問題はありませんが、コンピューターで容易に処理できるようには出来ていません。プログラムを書いて綺麗にするにしても、もの凄く大変です。結論から言えば郵便番号データのダウンロード - zipcloudを使った方が楽だよということです。

以下、先人の苦労

これは公金つぎ込んで整備するべきレベルだと思います。国には、こういう基礎的なデータの整備をもう少しお願いしたいですね。

以下はこの問題の根が深そうだと気づくまで書いた「住所一覧を得るプログラム」です。ゴミが多いですが、参考にどうぞ。そしてデータフォーマットの説明はコードを書く前にしっかり読むべきですね!

require 'kconv'
require "csv"
require "rubygems"
require "moji"

reg_num = '(\d|[一二三四五六七八九〇1234567890])+'

CSV.foreach('ken_all.csv'){|row|
  address = row[7..8].join("").toutf8
  address.gsub!("以下に掲載がない場合", "")
  address.gsub!(/.*?/, "")
  
  # 京都府京都市上京区扇町(寺町通今出川下る、寺町通石薬師上る、寺町通石薬師下
  # という表記の場合には、展開する
  town = row[8].toutf8
  
  eachPlace = Proc.new {|s, e, u| 
    s = Moji.zen_to_han(s)
    e = Moji.zen_to_han(e)
    u = Moji.zen_to_han(u)
    (s..e).map {|i| i + u }
  }
  
  
  if town =~ /(.*)(.*)/
    base_name = $1
    $2.gsub("", "").split("").map {|i|
      if i =~ /(#{reg_num})(#{reg_num})(.*)/
        p eachPlace.call($1, $3, $5)
      end
      base_name + i 
    }.each do |i|
      # puts i
    end
  else
    # puts address
  end
}