データの取得
今回は郵便局のサイトからデータをダウンロードします。
- 都道府県一覧 > 全国一括(1,691,560Byte)
全角となっている町域部分の文字数が38文字を越える場合、また半角となっているフリガナ部分の文字数が76文字を越える場合は、複数レコードに分割しています。
この郵便番号データファイルでは、以下の順に配列しています。
- 全国地方公共団体コード(JIS X0401、X0402)……… 半角数字
- (旧)郵便番号(5桁)……………………………………… 半角数字
- 郵便番号(7桁)……………………………………… 半角数字
- 都道府県名 ………… 半角カタカナ(コード順に掲載) (注1)
- 市区町村名 ………… 半角カタカナ(コード順に掲載) (注1)
- 町域名 ……………… 半角カタカナ(五十音順に掲載) (注1)
- 都道府県名 ………… 漢字(コード順に掲載) (注1,2)
- 市区町村名 ………… 漢字(コード順に掲載) (注1,2)
- 町域名……………… 漢字(五十音順に掲載) (注1,2)
※1 文字コードには、MS漢字コード(SHIFT JIS)を使用しています。
※2 文字セットとして、JIS X0208-1983を使用し、規定されていない文字はひらがなで表記しています。
今回は1,3,4,5,6,7,8,9のみ扱います。
テーブルの作成〜
流れとしてはcsvのデータを必要な項目に加工し、そのままsqliteでインポートしていきます。
データの整形
% nkf -g KEN_ALL.CSV
=> Shift_JIS
# utf-8に変換
% nkf -w --overwrite KEN_ALL.CSV
% nkf -g KEN_ALL.CSV
=> UTF-8
# 必要な項目のみ切り出し
% cut -d ',' -f 1,3,4,5,6,7,8,9 KEN_ALL.CSV > ken_all.csv
# 先頭に行番号を付与
% nl -s ',' db/ken_all.csv | tr -d ' ' > ken_data.csv
sqlite
# テーブルの作成
% sqlite3
sqlite> create table ken_all(id integer primary key autoincrement, code integer, post_code text, prefecture_kana text, address_1_kana text, address_2_kana text, prefecture_name text, address_1_name text, address_2_name text);
sqlite> .tables
=> ken_all
# データのインポート 🍺
sqlite> .mode csv
sqlite> .import ken_data.csv ken_all
sqlite> SELECT count(*) FROM ken_all;
=> count(*)
=> 124553
sqlite> CREATE INDEX post_code_index on ken_all(post_code);
sqlite> CREATE INDEX prefecture_name_index on ken_all(prefecture_name);
sqlite> .indices
=> post_code_index prefecture_name_index
sqlite> .headers ON
sqlite> SELECT * FROM ken_all LIMIT 5;
id,code,post_code,prefecture_kana,address_1_kana,address_2_kana,prefecture_name,address_1_name,address_2_name
1,1101,0600000,"ホッカイドウ","サッポロシチュウオウク","イカニケイサイガナイバアイ","北海道","札幌市中央区","以下に掲載がない場合"
2,1101,0640941,"ホッカイドウ","サッポロシチュウオウク","アサヒガオカ","北海道","札幌市中央区","旭ケ丘"
3,1101,0600041,"ホッカイドウ","サッポロシチュウオウク","オオドオリヒガシ","北海道","札幌市中央区","大通東"
4,1101,0600042,"ホッカイドウ","サッポロシチュウオウク","オオドオリニシ(1-19チョウメ)","北海道","札幌市中央区","大通西(1〜19丁目)"
5,1101,0640820,"ホッカイドウ","サッポロシチュウオウク","オオドオリニシ(20-28チョウメ)","北海道","札幌市中央区","大通西(20〜28丁目)"
DONE!⭐︎