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

Pocket
LINEで送る
GREE にシェア
LinkedIn にシェア

前回便利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データダウンロード
&nbhsp;

2. ZIPデータを解答→csvファイル
 

3. csvデータを読み込んでjson変換
 

4. jsonデータをファイルに保存
 

ざっくりとこんな感じでしょうか・・・
使うコマンドが大体イメージできるかと思います。

作業実行

1. ZIPデータダウンロード
&nbhsp;

 

2. ZIPデータを解答→csvファイル
 

【追加】
ここで気が付いたのですが、解答したcsvファイルは「shift-jisエンコード」でした。
 

なので、サクッとエンコード変換
 

 

3. csvデータを読み込んでjson変換
4. jsonデータをファイルに保存
 

この操作は、同時に行った方が効率がいいので、下記のように実行します。
 

 

ここで、内容を見て見ると、「”\”ホッカイドウ\””,」というようにダブルクォートのエスケープがそのままデータに入り込んでしまっています。
 

ここは簡単にawkを使って、事前に文字列の生合成を統一しておきたいと思います。
 

 

すこしポイントとして、$0表示している際に”\r”文字列があると、意図しない結果が表示されてしまうので、「sub(“\r”,””):」を使うことで、いらない文字列を削除しています。
※\rは、1行に1つしかないのでsubコマンドを使ってますが、1行に複数存在する文字列を変換(置換)したい場合はgsumを使ってください。
 

これで、綺麗なjsonファイルが生成されます。
 

そして、出来上がった配列データでは、カラム情報が分かりにくいので、そのjsonデータを元に連想配列に変換します。
 

 

5桁zipコードはもはや不要なので削除するとして、その他のカラム情報の詳細は郵便局に掲載されているので、ご参照ください。
 

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

必要ボジュールがインストールされていない場合

各種モジュールがインストールされていない場合は、インストールしてから実行してください。
 

 

最後に

変換したデータは、UTF-8で、全国の郵便番号データベースになっているので、jqコマンドを使って、各種検索ができる状態になっています。
 

そして、行数を調べて見ると”124,249″行存在していました。
明らかにWEB-APIで取得した数よりも多かったので、WEB-APIでの取得方法でもう少し工夫しないと、全部入りデータの取得ができていないことがわかりました。
 

データの流用性

今回のデータは、
郵便番号の3桁4桁でデータを振り分けた階層構造に変更するもよし、
都道府県、市区町村の階層で、データ検索する構造でもよし、
 

利用するシステムにあった構造に変換して使うとより効率的なデータになるでしょう。
 

上記コマンドをcron登録しておけば、毎月更新される郵便番号データベースの自動更新システムが構築できてしまいますね。
 

以前の会社では、これを手作業にしていましたが、やっぱ自動化ですよね・・・

Leave a Reply

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です