PHP でファイルを X 行から Y 行まで開くにはどうすればよいですか?
質問
PHP ドキュメントで私が見た最も近い方法は、指定された長さの fread() ですが、どの行から開始するかを指定していません。他に何か提案はありますか?
解決
あなたは行が任意の長さのものとすることができるので、ラインXから始まる読むことができるようにするつもりはありません。だから、行数をカウント開始から読み取る必要があります。例えば線Xに到達するために読んでます:
<?php
$f = fopen('sample.txt', 'r');
$lineNo = 0;
$startLine = 3;
$endLine = 6;
while ($line = fgets($f)) {
$lineNo++;
if ($lineNo >= $startLine) {
echo $line;
}
if ($lineNo == $endLine) {
break;
}
}
fclose($f);
他のヒント
はい、あなたは SplFileObject::seek
する
$file = new SplFileObject('filename.txt');
$file->seek(1000);
for($i = 0; !$file->eof() && $i < 1000; $i++) {
echo $file->current();
$file->next();
}
これはのSeekableIterator の界面からの方法であるといないとfseek
と混同。
そしてSplFileObjectが反復可能であるので、あなたは LimitIterator
でも簡単に行うことができますA>:
$file = new SplFileObject('longFile.txt');
$fileIterator = new LimitIterator($file, 1000, 2000);
foreach($fileIterator as $line) {
echo $line, PHP_EOL;
}
繰り返しますが、これはゼロベースであるため、2001年にライン1001です。
残念ながら、直線yにxをラインから読み取ることができるようにするために、あなたは改行を検出できるようにする必要があるだろう...と、あなたは、ファイル全体をスキャンする必要があると思います。しかし、あなたが想定しているのありませんのパフォーマンス上の理由から、このについて尋ねる、あなたは行は次のようにx
するy
取得することができます:
$x = 10; //inclusive start line
$y = 20; //inclusive end line
$lines = file('myfile.txt');
$my_important_lines = array_slice($lines, $x, $y);
を参照してください: array_sliceする
<?php
$f = fopen('sample.txt', 'r');
$lineNo = 0;
$startLine = 3;
$endLine = 6;
while ($line = fgets($f)) {
$lineNo++;
if ($lineNo >= $startLine) {
echo $line;
}
if ($lineNo == $endLine) {
break;
}
}
fclose($f);
?>
さて、あなたはそれが指定されたバイト数で動作するため、適切な位置を求めるために、関数fseek関数を使用することはできません。
私はそれがキャッシュまたは回線を介して次々に行くのいくつかの並べ替えなしには不可能だと思います。
あなたが関数freadを使用することはできません。あなたが実際に改行を見つけるために、ファイルを読むために持っているので、さまざまな機能がより適切です。 関数fgets のファイル行ずつ読み込みます。ループ内でそれを投げて、あなたがしたい行だけをキャプチャします。
それが怖かったんです…それならプランBだと思います:S
AJAX リクエストごとに次のことを行います。
- クライアントに返す行数を文字列に読み込みます。
- をコピーします 休む ファイルを一時ファイルにコピーします。
- 文字列をクライアントに返します。
これは面倒で、10,000 行を超えるファイルではおそらくかなり遅くなりますが、同じ内容を何度も読み取るよりはマシだと思います。少なくとも一時ファイルはリクエストごとに短くなります...いいえ?