PHP의 Line X에서 Line Y로 파일을 열려면 어떻게합니까?
문제
PHP 문서에서 가장 가까운 것은 주어진 길이를 fread ()하는 것이지만, 시작할 라인을 지정하지는 않습니다. 다른 제안이 있습니까?
해결책
선은 임의의 길이 일 수 있으므로 X에서 시작하는 것을 읽을 수 없습니다. 따라서 LINE 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
:
$file = new SplFileObject('longFile.txt');
$fileIterator = new LimitIterator($file, 1000, 2000);
foreach($fileIterator as $line) {
echo $line, PHP_EOL;
}
다시 말하지만, 이것은 제로 기반이므로 1001-2001 행입니다.
불행히도, 라인 X에서 y로 읽을 수 있으려면 라인 브레이크를 감지 할 수 있어야합니다 ... 전체 파일을 스캔해야합니다. 그러나 당신이 가정합니다 ~ 아니다 성능의 이유로 이것에 대해 물어 보면 라인을 얻을 수 있습니다. 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를 사용하여 적절한 위치를 찾을 수 없습니다.
나는 어떤 종류의 캐시가 없으면 불가능하다고 생각합니다.
라인을 찾고 있다면 프레드를 사용할 수 없습니다. 프레드는 라인 브레이크 수가 아닌 바이트 오프셋에 의존하기 때문에 사용할 수 없습니다. 실제로 라인 브레이크를 찾으려면 파일을 읽어야하므로 다른 기능이 더 적합합니다. fgets 라인 별 파일을 읽습니다. 그것을 루프로 던지고 원하는 줄만 캡처하십시오.
나는 그것을 두려워했다.
각 AJAX 요청에 대해 다음과 같이갑니다.
- 문자열을 읽으십시오.
- 복사 쉬다 파일의 임시 파일로
- 문자열을 클라이언트에게 반환합니다.
그것은 절름발이이며 아마도 10,000 개 이상의 라인 파일로는 꽤 느리게 될 것입니다. 그러나 나는 같은 것을 계속해서 읽는 것보다 낫다고 생각합니다. 적어도 모든 요청이 더 짧아지고 있습니다 ... 아니요?