システム開発ブログ

企画開発部

Linux

MySQL

郵便番号データを定期的に更新するサンプル(Linux & MySQL)

システムで郵便番号を入力すると、自動で住所を表示してくれるようなものがよくあると思います。
そのようなシステムを構築した際にやらなければいけないのが、
システムに入っている郵便番号データを更新しなければいけないことです。
市区町村の合併などにより毎月郵便番号のデータが更新されるため、
毎月の更新作業が必要になります。

始めは手動でCSVをダウンロードして、インポート作業を行うと思いますが、
それが毎月の作業となると、体制がしっかりしていない場合に作業漏れ等が発生してしまいます。
自動でダウンロードから取り込み処理まで行って、取り込みしたことだけをメールで
知らせてくれたらいいのに と思ったので、作ってみました。

今回作成したサンプルは、以下の環境を想定しております。

OS: Linux (CentOS5.4で検証済み)
DB: MySQL (MySQL5.1で検証済み)
シェル: bash

なお、ローカルファイルをDBにインポートする処理を行いますので、
取り込み処理を行うユーザーには、FILE権限を付ける必要がありますのでご注意ください。

では、実際のコードについて説明します。

まず、日本郵便のサイトからwgetコマンドを使用してCSVファイルをダウンロードします。

wget http://www.post.japanpost.jp/zipcode/dl/oogaki/lzh/ken_all.lzh

lzh形式で圧縮されているため、lhaコマンドで解凍します。

lha -x ken_all.lzh

以下のようなエラーが出た場合には、lhaコマンドがインストールされていないため、
インストールする必要があります。

-bash: lha: command not found


CentOSを使用していてyumでインストールしたい場合は、 dagのリポジトリからインストールすることになります。
まだ、dagのリポジトリを利用する設定をされていない場合は、 http://dag.wieers.com/rpm/FAQ.php#B のサイトより
お使いのサーバ環境の設定を行ってください。

今回私は、CentOS5.4 32bitを使用しているので、
rpm -Uhv http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm を実行しました。


以下のような表示になれば、正常に設定できたことになります。

http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm を取得中
警告: /var/tmp/rpm-xfer.Ep6Wp1: ヘッダ V3 DSA signature: NOKEY, key ID 6b8d79e6
準備中... ########################################### [100%]
1:rpmforge-release ########################################### [100%]

 

その後、yum install lha を実行してインストールを行い、 lha解凍を行います。

lha -x ken_all.lzh
ken_all.csv - Melted : ooooooooooooooooooooooooooooooooooooooooooooooooooooo

ken_all.csvの文字コードはShift_JISになっていますので、DBで使用している
文字コードがShift_JISでない場合には、CSVファイルの文字コード変換を行う必要があります。
文字コード変換コマンドの詳しい説明は、 Linuxで簡単に文字コード変換するをご覧ください。

今回は、DBの文字コードがUTF-8なのでShift_JISからUTF-8にファイルの文字コードを変換します。

iconv -f=sjis -t=utf8 < ken_all.csv > ken_all_utf8.csv

UTF-8に変換されたファイルが、ken_all_utf8.csv として出力されます。

この後は、ファイルをDBにインポートします。
mysqlのコンソールにログインし、使用するDBを選択後以下のクエリを使って一時テーブルに流し込みます。

LOAD DATA INFILE '/tmp/ken_all.csv' INTO TABLE "一時テーブル名" FIELDS TERMINATED BY ',' ENCLOSED BY '"';

取り込みが完了したら、実際にシステムで使用しているテーブルに合うように
取り込みを行えば全て完了となります。

これらの作業をざっと一連のスクリプトにしましたので、参考にしてみてください。
今回説明した自動でダウンロードする方法と、サーバからインターネットに接続できない場合にlzhファイルを自分でアップロードする方法をモードで切り替えられるようにしてみました。

サンプルスクリプト

この記事に関連する記事の一覧


システム開発ブログ

Twitterでilovex_officialをフォローしてください

カテゴリー

以前の部署別ブログ

ページのトップ