Posts Tagged ‘C言語’

全国郵便番号XMLデータ

月曜日, 3月 30th, 2009

日本郵政の郵便番号データをXML形式に変換したものを用意する機会があったので、公開してみます。
文字コードはUTF-8です。

attachment filejp_zipcode (1.8MB)

フォーマットは以下のような形式になっています。

<?xml version="1.0"?>
<JapanAreaData>
  <Prefecture>
    <PrefectureKana>ホッカイドウ</PrefectureKana>
    <PrefectureName>北海道</PrefectureName>
    <City>
      <CityName>札幌市中央区</CityName>
      <CityNameKana>サッポロシチュウオウク</CityNameKana>
      <Area>
        <AreaKana>アサヒガオカ</AreaKana>
        <AreaName>旭ケ丘</AreaName>
        <ZipCode>0640941</ZipCode>
      </Area>
      <Area>
        <AreaKana>オオドオリヒガシ</AreaKana>
        <AreaName>大通東</AreaName>
        <ZipCode>0600041</ZipCode>
      </Area>
            :
    </City>
    <City>
      <CityName>札幌市北区</CityName>
      <CityNameKana>サッポロシキタク</CityNameKana>
              :
    </City>
  </Prefecture>
  <Prefecture>
    <PrefectureKana>アオモリケン</PrefectureKana>
    <PrefectureName>青森県</PrefectureName>
          :
  </Prefecture>
</JapanAreaData>

元データは日本郵政のサイトにおいてある、CSVファイルです。Perlで書いた変換スクリプトでXMLに変換しました。

郵便番号CSVデータをXMLに変換するスクリプト

#!/usr/bin/perl

use strict;
use XML::Simple;

my $hash;
my %tmp_hash;
my $i;

$hash->{'Prefecture'} = [];

my $current_pref;
my $current_city;
my $pref_prefix = -1;
my $city_prefix = -1;

while (<>) {
        chomp;
        s/"//g;
        my ($idnum, $zip5, $zip7, $pref_kana, $city_kana, $area_kana, $pref, $city, $area) = split(/,/);

        if ($area eq '以下に掲載がない場合') {
                next;
        }

        if ($current_pref ne $pref) {
                $pref_prefix++;
                $city_prefix = -1;

                $current_pref = $pref;
                $current_city = "";

                push(@{$hash->{'Prefecture'}}, { 'PrefectureName' => $pref, 'PrefectureKana' => $pref_kana, 'City' => [] });
        }

        if ($current_city ne $city) {
                $city_prefix++;
                $current_city = $city;

                push(@{$hash->{'Prefecture'}[$pref_prefix]->{'City'}}, { 'CityName' => $city, 'CityNameKana' => $city_kana, 'Area' => [] });
        }
        push(@{$hash->{'Prefecture'}[$pref_prefix]->{'City'}[$city_prefix]->{'Area'}}, { 'ZipCode' => $zip7, 'AreaName' => $area, 'AreaKana' => $area_kana });
}

print XMLout($hash,  NoAttr => 1, RootName => 'JapanAreaData');