SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 社員募集 ...

【php】ファイルの後ろの方を取得したい(末尾10行など)

問題

phpで、ファイルの最後の方が欲しい。10行欲しい。

なるべくさくっとした書き方は?

答え

厳密に指定の行数を取得するなら、ファイルのポインタを末尾まで移動して、1文字ずつ読んでいって、改行があるたびにカウントして……といった手順が思いつきます。

ただその場合は、そこそこの長さのプログラムを書くことになりそうだと想像されます。

もうちょっと大雑把にざくっと取ってくる感じでよければ、file_get_contents関数で、以下のようなやり方ができます。

file_get_contents('/path/to/the/file', false, null, ファイルサイズ - 読みたいバイト数, 読みたいバイト数);

これで、ファイルの後ろの方から「読みたいバイト数」分を読み込めます。

ファイルの末尾まで読めばよいときは、一番最後の引数を省略することでも最後まで読んでくれます。


指定の行数が読みたい場合、対象のファイルの内容が大体分かっていれば、以下のような方法もよいと思います。

//どのファイルを読むか
$f = '/path/to/the/file';

//1行はせいぜい何バイトぐらいか?例えば絶対1000文字超えないなど
$a = 1000;

//何行読みたいか
$b = 10;

//その行数読むには、多くとも以下のバイト数分読めば事足りる
$c = $a * $b;

//必要なだけ後ろから読む
$x = file_get_contents($f, false, null, filesize($f) - $c);

//以下やりたいことに応じて処理
//例)改行でバラして、先頭の行だけは途中で切れている可能性があるので捨てる
$lines = explode($x, "\n");
array_shift($lines[0]);
//もし10行以上あると困る場合は、上の配列をさらに切り捨てる。
//残念なことに対象のファイルに1行しかなかったらデータ無しとなってしまう。たくさんデータがあるのが前提。わざと先頭に1つ改行を入れておくのも手。

コメント含めて長く書きましたが、ファイルの終わりの方を取ってくる処理の主要なところはfile_get_contents()関数1行です。

関連するメモ

コメント