Perlテキスト処理・正規表現入門

Perlで始める日本語処理

日本語処理をする理由

会計データが全て英語や数値だけだったら良いのですが、そんなことはありません。日本語の処理ができると、表現できる処理の幅が拡がります。

日本語処理のサンプル

まず、日本語が入力されたデータを見てみましょう。 こんな感じです。

読み込むデータ(data_jp.csv)

year,month,sales,member
2019,1,1000,山田
2019,2,2000,川口
2019,3,3000,佐藤一郎
2019,4,4000,佐藤次郎
2020,4,4500,佐藤三郎

この中から、苗字が佐藤さんの人が売り上げた総額を出してみましょう。

期待する出力結果

sales,member
11500,佐藤

コードはこんな感じになります。

サンプルコード(proc_data_jp.pl)

#! /usr/bin/env perl
use strict;
use warnings;
use Encode qw(decode encode);
use utf8;
use feature qw(say);

my $is_header = 1;
my @headers;
my @datas;
my $sales_sato = 0;

# 改行コードをCRLFへ
local $/ = "\x0D\x0A";

while ( my $line = decode('Shift_JIS', <>) ) {
  chomp $line;
  my @row = split /,/, $line;

  if ($is_header) {
    $is_header = 0;
    @headers = @row;
    next;
  }

  # { データの列名 => 項目 } とする
  my %hash;
  @hash{@headers} = @row;

  # データを使って計算
  $sales_sato += $hash{sales} if $hash{member} =~ /佐藤/;
}

say encode('UTF-8', "佐藤さんたちの売り上げは ${sales_sato} 円です。");

コード実行

$ perl proc_data_jp.pl data_jp.csv

出力結果

佐藤さんたちの売り上げは 11500 円です。

期待する出力結果とは異なりましたが、数字は合っていますね!

整形する前に、日本語処理の基本を解説していきます。

デコード処理

日本語のデータは、コンピュータが認識しやすいデータを、日本人に読み易いように加工したものです。ですので、コンピュータに認識しやすいデータに戻して、プログラムで処理できるようにする必要があります。

この処理を、デコード処理といいます。

文字コード

実際にデコードを行っているのは下記の箇所です。

while ( my $line = decode('Shift_JIS', <>) ) {

decode('Shift_JIS', <>)というのがデコード処理を行っている命令文です。

Shift_JISは読み込むデータの文字コードを表しています。日本語を表現するには、ほかにEUC-JPなどがあります。ほかの形式のデータを読み込んだ場合は、ここを変えないと正確にデータが読み取れません。

<>は読み込むデータの一行分を表現しています。今回のプログラムでは、一行ずつデータを読み込んで処理しています。

改行コード

改行コードというのは、改行であることをコンピュータに教えてあげるデータのことです。

改行であるかどうかをコンピュータは自動的に判別できません。ですから、改行コードが必要になります。

プログラムで改行コードを明示的に指定すると、意図しない結果になるのを防ぐことができます。

今回は下記の箇所で改行コードをCRLFに指定しています。

# 改行コードをCRLFへ
local $/ = "\x0D\x0A";

"\x0D\x0A" がCRLFを表現します。WindowsでCSVを作成すると改行コードをCRLFにすることが多いです。

目次