月ごとに更新される郵便番号の差分をとってみた

月ごとに更新される郵便番号の差分をとってみた

ソフトバンク・au・ドコモの方は、公式のオンラインショップを利用すれば頭金不要で通常のショップよりお得に購入できます。

郵便番号データの更新目的

私のメイン業務の1つである月次処理作業の中に「郵便番号のデータ更新」作業があります。

郵便番号データの郵便番号、住所(土地名、企業名)は日々更新されています。そのため、弊社では、日本の郵便局が月1で更新しているデータを元に、最新データを反映できるよう成形して更新しています。

これは、弊社のサービスの1つであるFA(フォームアシスト)の郵便番号周りの制御を支える重要な作業なのです。

郵便番号データの差分を取る理由

なぜ郵便番号データの差分を取る必要があるのか?

理由は簡単です。中身が何なのか、更新される内容は何なのかを全く把握せずにサービスの重要な部分を更新するのはあまりにも危険すぎるからです。というか、やっちゃダメですよね。

ちなみに、日本郵便 郵便局でも郵便番号データの差分データをダウンロードできます。

ですので、それを参照して最新データをダウンロードしたらそのデータを全部更新したらいいんじゃないの?と当初この作業をするときに疑問を抱いていました。

と言うのも・・・

image05

実は、手作業で全ての差分をチェックしていました。

全国一括データは12万件もあるため、まず999ファイルに分割してから各ファイルごとの差分をとっていました。それでも、正直この作業、骨が折れる作業でした。

ですが、この差分をとっていてわかったことは、郵便局で出している差分データはごく一部で、追加データ・廃止データの2種類な上に注意書きにもあるように「更新内容によっては中身がない場合がある」・・・まさに中身が抜けだらけ。

これではこのデータは使いようがないということで、毎月どうにかこの差分を出す作業を少しでも楽できないか考えながら差分を出していました。(さまざまな差分ツールの導入も試みましたが、結局出た差分をまとめたり、細かい差分は人力目視grepだから確認漏れも心配…)

限界は突然に…

なんだかんだ言いながらも、手作業でできてしまっていた差分作成ですが、突如としてその作業は困難を極めました。

差分ツールで差分があるファイル番号を抽出したところ、800ファイル以上に差分がでました。

image03

差分表を作ってくれるツールをつくろう。

最近はまってるシェルスクリプトで作ってみた

まず軽く差分をとってみることに。

diff <(cat backup/data/*.csv) <(cat newfile/data/*.csv) > test.txt

diff -q <(cat backup/data/*.csv) <(cat newfile/data/*.csv) > test.txt

diff -q backup/data/*.csv newfile/data/*.csv > test.txt

diff -s backup/data/*.csv newfile/data/*.csv > test.txt

どう頑張っても余計な差分もとれてきてしまう。

考えなおして、「そもそも順番の入れ替えは必要ないんだからdiff取る前にsortして順番入れ替えを潰せばいいんじゃん!」ということで、こんな感じにおさまりました。

#!/bin/sh
mkdir -p ./backup/data/sortdata
mkdir -p ./newfile/data/sortdata
mkdir -p ./diffdata

for i in {1..999}
do
i=`printf %03d $i`

if [ ! -e ./newfile/data/${i}.csv ];
then
       (echo "${i}.csv") >> ./newfile/data/sortdata/err.txt
       continue
fi

cat ./newfile/data/$i.csv | LC_ALL='C' sort > ./newfile/data/sortdata/$i.txt 
cat ./backup/data/$i.csv | LC_ALL='C' sort > ./backup/data/sortdata/$i.txt 

echo "${i}.csv \n ============================ \n" >> ./diffdata/result.txt
diff backup/data/sortdata/$i.txt newfile/data/sortdata/$i.txt >> ./diffdata/result.txt

done

まとめ

思ったよりも差分を取るのに苦労しました。とにかくいらない差分が取れる取れる。

そぎ落としすぎると今度は大事な情報もなくなっちゃうし、diffはまだまだ奥が深いです。
自分が勉強不足なだけかもしれないですけどね…精進精進。

もっとうまいやり方がないか模索中です。

でも、このツールのお陰で、今まで全作業工程合わせて10時間程度かかっていた作業時間が1時間未満でさくっとできるようになりました!

こんな形で出力されるファイルが出来ました。
もう少しわかりやすいように時間ができ次第修正していこうと思います。

001.csv 
 ============================ 

002.csv 
 ============================ 

003.csv 
 ============================ 

004.csv 
 ============================ 

:
:

070.csv 
 ============================ 

134d133
< 0708511,カブシキガイシヤ エシマク,株式会社 エシマク,旭川中央,,,,,,,,,,,,,,,,,,北海道,旭川市,五条通,8丁目左2号,,,,,,
071.csv 
 ============================ 

072.csv 
 ============================ 

:
:

これをきっかけにもっと色々ツールも作っていきたいなぁと思います。

それでは、また!

ソフトバンク・au・ドコモの方は、公式のオンラインショップを利用すれば頭金不要で通常のショップよりお得に購入できます。

【週刊bitWave】(メルマガ)始めました!

登録はこちらからメールアドレスを入力してお申込みください。

ご登録いただいたメールアドレスは 【週刊bitWave】の更新情報の配信にのみ使用します。

個人情報の取扱いに関しては、「プライバシーポリシー」をご確認ください。解除はいつでもこちらから行うことが可能です。

あなたにおすすめ

  • 『Codeigniter』の認証管理にアノテーションを利用してみた ショーケース・ティービーで展開するサービスを開発するために、PHPのフレームワーク『Codeigniter(読み:コードイグナイター)』を使うことになりました。 <参照:CodeIgniter『CodeIgniter W …
  • 内線電話用の番号検索|Slack APPで作ってみた ショーケース・ティービーではメール誤送信防止という観点から、社内連絡ではチャットツールを使用しています。 現在使用しているツールは「HipChat」。 <bitWave関連記事『情報漏えいしないための決定打!”Hi …
  • ぼくたちの失敗|ベテランエンジニア達の若き日の苦悩 6月半ばを過ぎ、新人エンジニアのみなさんも仕事に慣れてきた頃合いではないでしょうか。 しかし慣れは油断を生み、油断はミスを招くものです。当然、ミスをすれば怒られることもありますよね。 世の中には理不尽なことで怒られ …
  • 老後のはなし|66歳でプログラミングを始めた猟師 みなさんは自分の老後のことを考えていますか? 老後がハッキリしているのであれば、その老後のために財産をとっておくということも考えることでしょう。しかし、実際にはハッキリしていないため、なかなか老後のことを真剣に考えな …