ken_all.csvという名前のファイルを見て目眩がする方は、友達になれそうです。
日本郵便が提供している郵便番号データは、データ構造としては最悪です。人間が見る分には問題はありませんが、コンピューターで容易に処理できるようには出来ていません。プログラムを書いて綺麗にするにしても、もの凄く大変です。結論から言えば郵便番号データのダウンロード - zipcloudを使った方が楽だよということです。
以下、先人の苦労
- 日本郵政の郵便番号データの見方(とテストパターン)
- 「郵便番号データの落とし穴」に落ちてしまいました。 - 日記
- 郵便番号から住所を検索するサービスにまともなものがない - ぐるぐる~
- 郵便番号データは自分で加工しない - daily dayflower
これは公金つぎ込んで整備するべきレベルだと思います。国には、こういう基礎的なデータの整備をもう少しお願いしたいですね。
以下はこの問題の根が深そうだと気づくまで書いた「住所一覧を得るプログラム」です。ゴミが多いですが、参考にどうぞ。そしてデータフォーマットの説明はコードを書く前にしっかり読むべきですね!
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 }