郵便番号データベースをJSON変換して取得する方法

2018年11月26日

PHP テクノロジー プログラミング

前回便利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登録しておけば、毎月更新される郵便番号データベースの自動更新システムが構築できてしまいますね。 以前の会社では、これを手作業にしていましたが、やっぱ自動化ですよね・・・

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。