Perl/Perlの基礎知識

Perl の正規表現で文字検索(5ページ目)

Perl の「正規表現」を使って、文字検索を行います。

井上 みやび子

執筆者:井上 みやび子

Perlガイド

パターンが「マッチしない」事のチェック

さて、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 ファイルを読み込んでみて、狙った行が出力されるかを確かめてみて下さい。
もうひと頑張りすると自動でファイルを書き換える事もできますがそれはまたいずれやりましょう。
疑問はあると思いますがいずれまた...

疑問はあると思いますがいずれまた...


【編集部おすすめの購入サイト】
Amazonで Perl 関連の書籍をチェック!楽天市場で Perl 関連の書籍をチェック!
  • 前のページへ
  • 1
  • 3
  • 4
  • 5
※記事内容は執筆時点のものです。最新の内容をご確認ください。
※OSやアプリ、ソフトのバージョンによっては画面表示、操作方法が異なる可能性があります。

あわせて読みたい

あなたにオススメ

    表示について

    カテゴリー一覧

    All Aboutサービス・メディア

    All About公式SNS
    日々の生活や仕事を楽しむための情報を毎日お届けします。
    公式SNS一覧
    © All About, Inc. All rights reserved. 掲載の記事・写真・イラストなど、すべてのコンテンツの無断複写・転載・公衆送信等を禁じます