パターンが「マッチしない」事のチェック
さて、CSVの形式チェックを行っている元のサンプルプログラムに戻ります。データのチェックが必要な点はもう無いでしょうか?4,株式会社鈴木貿易,9870021,大阪市南区島中9-9-9これが、少し気になりますね。「大阪府」の記載がありません。関東圏だと横浜市の方はかなりの割合で「神奈川県」と書かない方が多いように思いますが、大阪の方もそうでしょうか。
郵便番号があれば郵便は問題なく届きますが、データとしては全て都道府県が入っていた方がきれいです。例えば「都道府県別顧客数」などの統計を出す時は、都道府県名がきっちりと入っていた方がやりやすいですね。
という事で、都道府県の記載が無い行も抽出してみましょう。ある特定のパターンが現れない事は以下のようにチェックします。
検査対象 !~ m/検索キーワード/マッチのチェックをした時の「=」を「!」に変えたものです。残りの記法は全て同じです。
では、この書き方で、都道府県が現れない行をチェックしてみましょう。
while(<DATA>){ $_ !~ m/,.{1,3}[都道府県]/ and print $_; }指定したパターンは、「フィールドの始まりを表す半角カンマの後に、3文字以内で何かの文字と、それに引き続いて「都道府県」のいずれかの文字が現れる」です。
このプログラムを実行すると、以下のように「大阪府」の記載の無い行が抽出されました。
4,株式会社鈴木貿易,9870021,大阪市南区島中9-9-9
プログラムのまとめ
では、ここまでに行った3種類のチェック (「株式会社」と記載がある、郵便番号が区切られていない、都道府県が登録されてない) のいずれかに引っかかったらその行を出力する、というようにプログラムを変えてみましょう。最終プログラムは外部からCSVファイルを読み込めるようにします。#CSVファイルから形式に問題がある行を抽出する use strict; use warnings; use utf8; binmode STDOUT, 'encoding(utf8)'; #Windows の場合は utf8 -> cp932 my $fh; open ($fh, '<:encoding(cp932)', 'check.csv') or die "ERROR: open: check.csv: $!\n" ; while(<$fh>){ if ( $_ =~ m/株式会社/ or $_ =~ m/,¥d{7},/ or $_ !~ m/,.{1,3}[都道府県]/ ){ print $_; } } close $fh;色々な CSV ファイルを読み込んでみて、狙った行が出力されるかを確かめてみて下さい。
もうひと頑張りすると自動でファイルを書き換える事もできますがそれはまたいずれやりましょう。
疑問はあると思いますがいずれまた...