ファイルの行数をカウントする方法を4つ紹介します。
これらの方法を大別すると、PHPの関数を使用する方法と、外部プログラムのコマンドを使用する方法の2つに分けられます。
ファイルの末尾が空行のときには、その行はカウントされません。これは以下の4つの方法すべてに当てはまります。
$fp = fopen( $filename, 'r' ); for( $count = 0; fgets( $fp ); $count++ );
読み込むデータがなくなるまでfgets()で1行ずつ読み込み、その読み込んだ回数をカウントします。
$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コマンドで、すべての行にマッチするように条件を指定して検索します。
$count = exec( 'find /c /v "" < '.$filename );Windowsコマンド集 - find:ITpro
この方法ではファイルサイズが大きすぎると、結果としてゼロが返されることがあります。このときにはファイルからリダイレクトせずに、
$ret = exec( 'find /c /v "" '.$filename );
とすることで正しく処理できます。ただしこのときは、
---------- SAMPLE.TXT: 100
のような形式で結果が返されます。
findコマンドは、ファイルの末尾が空行のときには、行数が1つ少なくカウントされます。
wcコマンドは、ファイルの行数などを求めるためのコマンドです。
$ret = exec( 'wc -l '.$filename );wc ファイルのバイト数/単語数/行数を出力する - UNIXコマンド辞典:CodeZine(コードジン)
Windowsにはwcが用意されていませんが、Cygwinを導入しているならばインストールされているかもしれません。そのときにはphp.iniに、
safe_mode_exec_dir = "C:/cygwin/bin"
と記述することで、コマンドへのパスを設定できます。
wcコマンドは、ファイルの末尾が空行のときには、行数が1つ少なくカウントされます。