前回便利APIを使って全国の市区町村情報一覧をJSONデータとして取得しましたが、どうも件数が怪しい・・・
JSONコントロールに最適なjqコマンドの検証ができるサイト紹介
都道府県別に綺麗に同じ数の市区町村しかデータに登録されていないので、それを確認するために、市区町村の確実な一覧を取得したくなったので、郵便局サイトでダウンロードできる郵便番号データベースをJSON化してみたいと思います。
ダウンロードサイトの紹介
以前にEFOツールを企業サービスで構築したのが10年前ですが、その時から一切仕様が変わっていないので、安定したデータ提供サービスを行っている郵便番号ダウンロードサービスを利用します。
https://www.post.japanpost.jp/zipcode/download.html
このサイトの「住所の郵便番号(CSV形式)」をダウンロードします。
https://www.post.japanpost.jp/zipcode/dl/kogaki-zip.html
その中の「
全国一括」をダウンロードするのですが、zipとしてダウンロードされるのでその素材を使って、json変換まで行いたいと思います。
作業フロー
1. ZIPデータダウンロード
2. ZIPデータを解答→csvファイル
3. csvデータを読み込んでjson変換
4. jsonデータをファイルに保存
ざっくりとこんな感じでしょうか・・・
使うコマンドが大体イメージできるかと思います。
作業実行
1. ZIPデータダウンロード
wget https://www.post.japanpost.jp/zipcode/dl/kogaki/zip/ken_all.zip
2. ZIPデータを解答→csvファイル
unzip ken_all.zip
【追加】
ここで気が付いたのですが、解答したcsvファイルは「shift-jisエンコード」でした。
なので、サクッとエンコード変換
iconv -f SHIFT_JIS -t UTF-8 KEN_ALL.CSV > ken_all_utf8.csv
3. csvデータを読み込んでjson変換
4. jsonデータをファイルに保存
この操作は、同時に行った方が効率がいいので、下記のように実行します。
jq -s -R 'split("\n")|map(split(","))' ken_all_utf8.csv > ken_all.json
ここで、内容を見て見ると、「"\"ホッカイドウ\"",」というようにダブルクォートのエスケープがそのままデータに入り込んでしまっています。
ここは簡単にawkを使って、事前に文字列の生合成を統一しておきたいと思います。
awk -F, '{sub("\r",""); print "[" $0 "]"; }' ken_all_utf8.csv | jq -s -r -c ". | .[]" > ken_all.json
すこしポイントとして、$0表示している際に"\r"文字列があると、意図しない結果が表示されてしまうので、「sub("\r",""):」を使うことで、いらない文字列を削除しています。
※\rは、1行に1つしかないのでsubコマンドを使ってますが、1行に複数存在する文字列を変換(置換)したい場合はgsumを使ってください。
これで、綺麗なjsonファイルが生成されます。
そして、出来上がった配列データでは、カラム情報が分かりにくいので、そのjsonデータを元に連想配列に変換します。
jq -c '{"code":.[0] , "zip":.[2] , "prefecture":.[6] , "city":.[7] , "town":.[8] , "prefecture_kana":.[3] , "city_kana":.[4] , "town_kana":.[5] , "town_flg":.[9] , "koaza_flg":.[10] , "cho_flg":.[11] , "only_zip_flg":.[12] , "update_flg":.[13] , "reoson":.[14]}' ken_all.json > ken_all_2.json
5桁zipコードはもはや不要なので削除するとして、その他のカラム情報の詳細は郵便局に掲載されているので、ご参照ください。
https://www.post.japanpost.jp/zipcode/dl/readme.html
必要モジュールがインストールされていない場合
各種モジュールがインストールされていない場合は、インストールしてから実行してください。
#Debian , Ubuntu系
$ sudo apt-get install unzip
$ sudo apt-get install iconv
# CentOS系
$ yum install unzip
$ yum install iconv
最後に
変換したデータは、UTF-8で、全国の郵便番号データベースになっているので、jqコマンドを使って、各種検索ができる状態になっています。
そして、行数を調べて見ると"124,249"行存在していました。
明らかにWEB-APIで取得した数よりも多かったので、WEB-APIでの取得方法でもう少し工夫しないと、全部入りデータの取得ができていないことがわかりました。
データの流用性
今回のデータは、
郵便番号の3桁4桁でデータを振り分けた階層構造に変更するもよし、
都道府県、市区町村の階層で、データ検索する構造でもよし、
利用するシステムにあった構造に変換して使うとより効率的なデータになるでしょう。
上記コマンドをcron登録しておけば、毎月更新される郵便番号データベースの自動更新システムが構築できてしまいますね。
以前の会社では、これを手作業にしていましたが、やっぱ自動化ですよね・・・
0 件のコメント:
コメントを投稿