gallu’s blog

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

郵便番号にまつわるエトセトラ

郵便番号は、郵政省様(…ぢゃないんだよなぁすでに)がWebにご用意なさっている
http://www.post.japanpost.jp/zipcode/download.html
あたりから適宜データを取得して切り貼りしてDBにinsertすれば終了します…なんていう話ならだれがここに書くかい(ぐれーてるもーど


とりあえず。
読み仮名データの促音・拗音を小書きで表記しないもの( http://www.post.japanpost.jp/zipcode/dl/oogaki.html )はありえないので
読み仮名データの促音・拗音を小書きで表記するもの( http://www.post.japanpost.jp/zipcode/dl/kogaki.html )を選択します。
どれをチョイスするかはまぁ個人の自由なのですが。
…問題は、データの質とそれに伴う処理。


とりあえず「データがLHAってどゆことよ」という発言はあきらめてLinux上では以下のごとく処理しませう。

以下からソースを取得
http://sourceforge.jp/projects/lha/files/

コンパイル
cd /usr/src
tar zvxf lha-1.14i-ac20050924p1.tar.gz
cd lha-1.14i-ac20050924p1
./configure
make
make check
< as root >
make install

で
# type lha
lha is /usr/local/bin/lha

ちなみにコマンド的には

lha e hogehoge.lzh

で解凍できます。


ちゅぎ。
とりあえず
http://www.post.japanpost.jp/zipcode/dl/readme.html
を読みませうデータの説明ですでも説明よんだだけじゃわかんないってばよ orz
素人さんは例えば

一般的な表計算ソフト等では、郵便番号を示す列や町域を示す列において、上1けたあるいは2けたの「0」「00」が表示されない場合や、年月日で表示される場合がありますので、ご注意ください。

あたりに目が行きそうですがンなものはCSVデータを「それに適さないソフトウェア(例:Excel)」で読むのが悪い」だけです。
問題は違うところにあります。


とりあえず「何で半角カナよ」とかいう突っ込みは置いておくとして。

9)の項目位置に、「"以下に掲載がない場合"」とは、お探しの町域が見つからない場合にお書きいただく番号であり、町域を特定するものではありませんのでご注意ください。

とか

9)の項目位置に、「"○○市(または町・村)の次に番地がくる場合"」とは、市区町村名の後ろに町域名がなく、番地がくる住所(例:○○郡△△町1234番地)の場合にお書きいただく番号です。

とか

9)の項目位置に、「"○○市(または町・村)一円"」とは、町域名がない市区町村の場合にお書きいただく番号です。

とかはエンジニアとして「それは別レコードで日本語じゃなくてコードで書こうよ」とか思うですが如何なものでござんしょか?


でもでも。
一番やっかいなのは多分ここ。

※7
全角となっている町域名の文字数が38文字を超える場合、また、半角カタカナとなっている町域名のフリガナが76文字を越える場合には、複数レコードに分割しています。

さらっとかかれてますこのままじゃ重要性がもうひとつピンときません。
The Internet素晴らしいですすでに苦労されているかたがたがいらっしゃいます先人の知恵です千尋だと神隠しです。
面倒なんで、重要部分をさらりとこぴぺ。

http://www.f3.dion.ne.jp/~element/msaccess/AcTipsKenAllCsv.html

あなたには、マージすべきレコードを見分けるためのフラグが見つかっただろうか?
一見フラグ1 かフラグ2 が 1 になっているレコードがマージ対象のように錯覚するかもしれないが、よく見ると「8260043」のフラグが一つも立っていないため、そうではないことが分かるだろう。
それどころか、「8260043」と、比較対照用の末尾レコード(東京都新宿区南町)は、フラグ構成が完全に同一である。
いったいどういうことなのだろうか?
実は、フラグだけ見ていても見分けることは出来ない。
正解は、フラグ4(一つの郵便番号で二以上の町域を表す場合の表示)が 0(つまり一つの郵便番号で一つの町域を表す)で、尚かつ同一郵便番号のレコードが 2 レコード以上の場合、マージする必要があるのだ。
つまり、郵便番号でグループ化したレコードのカウントを求めて比較しない限り、見分けることは出来ない。

次に、サンプルの「0285102」(岩手県岩手郡葛巻町)を見ていただきたい。
いったいこれのどこが「全角となっている町域名の文字数が38文字を超える場合」に該当するのだろうか?
実際には 2 レコード合わせても 31 文字しかない(葛巻(第40地割「57番地125、176を除く」〜第45地割))。
フリガナも 44 文字しかなく、「半角カタカナとなっている町域名のフリガナが76文字を越える場合」にも該当しない。
つまり、このデータは「複数レコードに分割」する必要がまったくないにもかかわらず、なぜか分割されているのだ。

http://madscientist.jp/~calc/topics/postal.html

一行の長さ制限により分割されたデータ:

26106,"600 ","6008183","京都府","京都市下京区","夷之町(間之町通五条下る3丁目、間之町通花屋町上る、間之町通",0,0,0,1,0,0
26106,"600 ","6008183","京都府","京都市下京区","六条下る、花屋町通間之町西入、花屋町通間之町東入、花屋町通東洞院東入、",0,0,0,1,0,0
26106,"600 ","6008183","京都府","京都市下京区","六条通間之町西入、六条通間之町東入、六条通東洞院東入)",0,0,0,1,0,0

この3行で
〒600-8183 は 京都市下京区
夷之町(間之町通五条下る3丁目、間之町通花屋町上る、間之町通六条下る、花屋町通間之町西入、花屋町通間之町東入、花屋町通東洞院東入、六条通間之町西入、六条通間之町東入、六条通東洞院東入)
という一つの住所データになる。
・・・・、間之町通
六条下る、・・・・
というところでデータを切ってるあたりに担当者のやる気のなさが伺えます。

知ってないと理解不能なデータ:

03502,"02879","0287903","岩手県","九戸郡種市町","第1地割〜第3地割(八木南町、八木北町)",0,1,0,0,0,0

〒600-8183 は 岩手県九戸郡種市町 第1地割〜第3地割(八木南町、八木北町)
どう分解していいのか迷ってたら、東北出身のとある人が、地割は登記簿上の呼び名で、後者が住民が呼んでる名前だと教えてくれました。

表記の問題:
()で括ってある部分は

* 複数の町名・番地 → そのまま表示
* コメント → 削る
* その土地の別名(通称みたいなの) → 二件に分けて登録

の3つのケースがあって、データがどれに該当するかは文脈から判断しなくてはいけないというスバラシイ仕様。

とりあえずですねぇなんていうか「助けてママン」;;


色々とプログラムつかってマージする予定ですがマージだけね分解はしないよ?
でも…サイズでかいから。気をつけないと色々と痛いんだよねぇ orz


以上多分何気にはまる人多そうなのでめも。