문제

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 요청에 대해 다음과 같이갑니다.

  1. 문자열을 읽으십시오.
  2. 복사 쉬다 파일의 임시 파일로
  3. 문자열을 클라이언트에게 반환합니다.

그것은 절름발이이며 아마도 10,000 개 이상의 라인 파일로는 꽤 느리게 될 것입니다. 그러나 나는 같은 것을 계속해서 읽는 것보다 낫다고 생각합니다. 적어도 모든 요청이 더 짧아지고 있습니다 ... 아니요?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top