郵便番号簿の不要なデータを削除

Perl熱が高まっています。

Perlの存在そのものを教えてくれた@dankogaiさん、弾さんの「勝手に添削」でその存在を知った@yusukebeさん(すごくて、すごいエロい人、「ボケて」の中の人)、YAPC::Asiaというイベントの存在、それに参加された方々の発表のアツさ。

もろもろに触発されて、じゃあPerlやってみようと。そういう企画。

日本郵便のHPからダウンロードできる郵便番号簿のCSVファイルを使ったプログラムを書いてみました。

データ形式は以下のようになっています。

  1. 全国地方公共団体コード
  2. (旧)郵便番号(5桁)
  3. 郵便番号(7桁)
  4. 都道府県名
  5. 市区町村名
  6. 町域名
  7. 都道府県名
  8. 市区町村名
  9. 町域名
  10. 一町域が二以上の郵便番号で表される場合の表示
  11. 小字毎に番地が起番されている町域の表示
  12. 丁目を有する町域の場合の表示
  13. 一つの郵便番号で二以上の町域を表す場合の表示
  14. 更新の表示
  15. 変更理由
ここから必要な部分のみ抽出して別ファイルに保存するプログラム。

準備

全国版のCSVファイルは、12万行以上もあるため、最初の100件をpractice.csvとして保存し、practice.out.csvとして書き出すようにします。

成果物

郵便番号~町域名までのデータのみのCSVをつくり直すプログラムです。

基本構文すらまだスラっと出てきませんが、ポイントは以下のとおり。

  1. 不要なデータを取り除いて返す、trimData関数
  2. csvの分割はsplit
  3. 必要なデータの判定は、正規表現

躓いたぞ!「正規表現の書き方」

正規表現の書き方を理解するまで、

my $res =~ /うってかわって/; # warinig!!

これで、なぜwarningが出るのかわからなくて、

my $hoge = "あいつはクスリをうってかわってしまった" my $res = $hoge =~ /うってかわって/;

こう書く意味がようやく理解できたり。

(警告は、未定義の値にパターンを使用たことによるものでした。)

ちなみに、パターンの返り値は「1」か「空文字」

マッチした時にif文を通すには、

if (/ほげほげ/)

パターンを否定するときは、

if (!/ほげほげ/)

これに気づくまでかなり時間がかかった:(

覚えたぞ!「後置if文」

「後置if文」は、さわりはじめこそ気持悪RYYYY!でしたが、さわっているうちに実に良くなじむぞ!な印象。

こんなやつです。

print "Hello Perl!" if ($lang eq "perl"); print "Hello C++!" if ($lang eq "cplusplus"); print "Hello JavaScript!" if ($lang eq "js");

ソース