郵便番号データをインポートする 2016/11

日本郵便のHPより郵便データをダウンロードする。
$ wget http://www.post.japanpost.zipcode/dl/kogaki/zip/ken_all.zip

ダウンロードしたファイルを解凍し、CSVファイルの文字コードを確認する。
$ unzip ken_all.zip
$ file -i KEN_ALL.CSV
KEN_ALL.CSV: text/plain; charset=unknown-8bit
※ charset = unknown-8bit -> ファイルの文字コードがShift_JISであることを表している。

CSVファイルの文字コードをSJISからUTF-8へ変換する。
$ iconv -f Shift_JIS KEN_ALL.CSV > KEN_ALL.utf-8.csv

使用する用途に応じて必要なカラムだけを抜き出す。
$ cut -d, -f3,4,5,6,7,8,9 KEN_ALL.utf-8.csv > KEN_ALL.utf-8.cut.csv
※ ここでは、郵便番号, 都道府県名(半角カタカナ), 市区町村名(半角カタカナ), 町域名(半角カタカナ), 都道府県名(漢字), 市区町村名(漢字), 町域名(漢字)を使用する。

半角カナを全角カナに変換する。
$ nkf -X KEN_ALL.utf-8.cut.csv > KEN_ALL.utf-8.cut.zenkaku.csv
※ nkfは2.1.3以上で

ダブルクォーテーションを取り除く。
$ sed -i 's/"//g' KEN_ALL.utf-8.cut.zenkaku.csv

不要なデータを取り除く
$ sed -i 's/イカニケイサイガナイバアイ/ /g' KEN_ALL.utf-8.cut.zenkaku.csv
$ sed -i 's/以下に掲載がない場合/ /g' KEN_ALL.utf-8.cut.zenkaku.csv
※ ここでは半角スペースに変換する。

データ受け入れテーブルを作成
CREATE TABLE t_yubin_bango (
  yubin_bango TEXT NOT NULL,      -- 郵便番号
  todofuken_kana TEXT NOT NULL,   -- 都道府県名(半角カタカナ)
  shikuchoson_kana TEXT NOT NULL, -- 市区町村名(半角カタカナ)
  choikimei_kana TEXT NOT NULL,   -- 町域名(半角カタカナ)
  todofuken TEXT NOT NULL,        -- 都道府県名(漢字)
  shikuchoson TEXT NOT NULL,      -- 市区町村名(漢字)
  choikimei TEXT NOT NULL         -- 町域名(漢字)
);

psqlからCSVデータをテーブルへインポート
psql=> \copy t_yubin_bango FROM '/path/to/csv/KEN_ALL.utf-8.cut.zenkaku.csv' with csv;

郵便番号に主キーが張れないのでインデックスを作成する。
psql=> CREATE INDEX i_yubin_bango ON t_yubin_bango(yubin_bango);