郵便番号簿の不要なデータを削除
Perl熱が高まっています。
Perlの存在そのものを教えてくれた@dankogaiさん、弾さんの「勝手に添削」でその存在を知った@yusukebeさん(すごくて、すごいエロい人、「ボケて」の中の人)、YAPC::Asiaというイベントの存在、それに参加された方々の発表のアツさ。
もろもろに触発されて、じゃあPerlやってみようと。そういう企画。
日本郵便のHPからダウンロードできる郵便番号簿のCSVファイルを使ったプログラムを書いてみました。
データ形式は以下のようになっています。
- 全国地方公共団体コード
- (旧)郵便番号(5桁)
- 郵便番号(7桁)
- 都道府県名
- 市区町村名
- 町域名
- 都道府県名
- 市区町村名
- 町域名
- 一町域が二以上の郵便番号で表される場合の表示
- 小字毎に番地が起番されている町域の表示
- 丁目を有する町域の場合の表示
- 一つの郵便番号で二以上の町域を表す場合の表示
- 更新の表示
- 変更理由
準備
全国版のCSVファイルは、12万行以上もあるため、最初の100件をpractice.csvとして保存し、practice.out.csvとして書き出すようにします。成果物
郵便番号~町域名までのデータのみのCSVをつくり直すプログラムです。基本構文すらまだスラっと出てきませんが、ポイントは以下のとおり。
躓いたぞ!「正規表現の書き方」
正規表現の書き方を理解するまで、
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");