新郵便番号データの説明

http://www.post.japanpost.jp/zipcode/dl/readme.html

このデータをそのまま加工を少なく格納すべくテーブルを定義

create table postlists               -- ■ 郵便番号簿
(
  id            serial primary key, --郵便番号ID 自動連番
  jiscode       text,               --全国地方公共団体コード
  old_id        varchar(5),         --(旧)郵便番号(5桁)
  post_id       char(7),            --郵便番号(7桁)
  ken_k         text,               --都道府県名カタカナ
  si_k          text,               --市区町村名カタカナ
  tyou_k        text,               --町域名カタカナ
  ken           text,               --都道府県名
  si            text,               --市区町村名
  tyou          text,               --町域名
  somezips      int,                --一町域が二以上の郵便番号で表される場合
  aza           int,                --小字毎に番地が起番されている町域の表示
  choume        int,                --丁目を有する町域の場合の表示
  sometowns     int,                --一つの郵便番号で二以上の町域を表す場合
  changed       int,                --更新の表示
  changed_why   int                 --変更理由
);
create index postcodeindex on postlists using btree(post_id);

PostgreSQLのDBは、これまでEUC_JPで作成してきました。

郵便番号簿も.lzhを展開しKEN_ALL.CSV(shift-jis)を

require "nkf"
ARGF.each_with_index do | line,i |
  line.gsub!(/"/,'')
  line.gsub!(/,/,"\t")
  print #{i+1}+"\t"+NKF.nkf('-XSe', line)
end

上記スクリプトを s2e.rb として

 $ ./s2e.rb KEN_ALL.CSV > ken_all.euc

で実行して 変換後のファイルを作成します。

これを PostgreSQLの postlists テーブルに流し込むには、DB名が、postとして

$ psql post

これでSQLインタプリタを立ち上げて

post=# \copy postlists from ken_all.euc

と copyコマンドでテーブル名とテキストファイルを指定します。
うまくゆけば、

\.

と表示されます。で半角カナは、全角カナに shift-jisはEUC_JPにしていたのを
そのまま使いつつ rails用にid も追加。

今回は、PostgreSQLのDBは、UTF-8なのでUTF-8 に挑戦です。

UTF-8変換は uconv を使っていたのが、今のnkfは、UTF-8に変換できたか
どうか調べるのが面倒だったので、結局 エディタでUTF-8に変換しken.utf8に