PHPで複数のファイルから該当するデータの件数を取得する

phpで複数のファイルから正規表現に一致するデータの件数を取得する方法です。

getFileListメソッドでファイル一覧を取得しています。globを使うことでファイル形式を正規表現で指定することが可能です。

preg_match_allで正規表現に一致するデータが第3引数に指定してある$matchesに入ります。 この時、正規表現のマッチパターンが複数パターンになることを想定して連想配列になりますので、中身のデータを取り出す際にはforeachを2回分実行しています。

<?php

$pattern= '/account\d{7}/';
$path= 'C:\home';

function getFileList($dir) {
    $files = glob(rtrim($dir, '/') . '/*.csv');
    $list = array();
    foreach ($files as $file) {
        if (is_file($file)) {
            $list[] = $file;
        }
        if (is_dir($file)) {
            $list = array_merge($list, getFileList($file));
        }
    }

    return $list;
}
$array = array();

$list = getFileList($path);

foreach ($list as $key => $value){
    $contents = file_get_contents($value);
    preg_match_all($pattern,$contents,$matches);
    foreach ($matches as $key2 => $value2){
        foreach ($value2 as $key3 => $value3){
            if (!array_key_exists($value3, $array)) {
                $array[$value3] = 1;
            }else{
                $array[$value3] = $array[$value3] + 1;
            }
        }
    }
}
asort($array);
print_r($array) ;

ちなみにコマンドベースでPHPを実行してprintの結果をファイルに出力する場合、もちろんPHP内でファイル書き出し操作をしてもいいですが、以下のように渡すのが手っ取り早いです。

hoge.php > hoge.txt