ファイルの行数の取得

ファイルの行数をカウントする方法を4つ紹介します。

  1. fgets()関数
  2. file()関数
  3. findコマンド
  4. wcコマンド

これらの方法を大別すると、PHPの関数を使用する方法と、外部プログラムのコマンドを使用する方法の2つに分けられます。

ファイルの末尾が空行のときには、その行はカウントされません。これは以下の4つの方法すべてに当てはまります。

fgets()関数

$fp = fopen( $filename, 'r' );
for( $count = 0; fgets( $fp ); $count++ );

読み込むデータがなくなるまでfgets()で1行ずつ読み込み、その読み込んだ回数をカウントします。

file()関数

$count = count( file( $filename ) );

ファイル全体を配列に読み込み、その配列数を取得します。file()は行ごとに配列の要素に格納するため、それを利用しています。

ただしファイルのサイズが大きすぎると、Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate ...とエラーとなることがあります。これはphp.iniの、memory_limitの制限を超えた場合に発生します。ちなみに134217728byteとは127.5Mbyteです。

findコマンド

findコマンドで、すべての行にマッチするように条件を指定して検索します。

$count = exec( 'find /c /v "" < '.$filename );
Windowsコマンド集 - find:ITpro

この方法ではファイルサイズが大きすぎると、結果としてゼロが返されることがあります。このときにはファイルからリダイレクトせずに、

$ret = exec( 'find /c /v "" '.$filename );

とすることで正しく処理できます。ただしこのときは、

---------- SAMPLE.TXT: 100

のような形式で結果が返されます。

findコマンドは、ファイルの末尾が空行のときには、行数が1つ少なくカウントされます。

wcコマンド

wcコマンドは、ファイルの行数などを求めるためのコマンドです。

$ret = exec( 'wc -l '.$filename );
wc ファイルのバイト数/単語数/行数を出力する - UNIXコマンド辞典:CodeZine(コードジン)

Windowsにはwcが用意されていませんが、Cygwinを導入しているならばインストールされているかもしれません。そのときにはphp.iniに、

safe_mode_exec_dir = "C:/cygwin/bin"

と記述することで、コマンドへのパスを設定できます。

wcコマンドは、ファイルの末尾が空行のときには、行数が1つ少なくカウントされます。

PHPのマニュアルから検索