php - 파일 - lseek




줄이 아닌 바이트 단위의 fseek()? (4)

계속 진행할 줄 번호 만있는 경우 줄을 찾는 다른 방법은 없습니다. 파일은 행 기반 (또는 문자 기반)이 아니므로 파일의 특정 행으로 점프 할 수는 없습니다.

파일에서 큰 덩어리를 버퍼로 읽고 그 라인을 읽는 것과 같이 약간 더 빨라지는 줄을 파일에서 읽는 다른 방법이있을 수 있지만, 몇 퍼센트 더 빨라지기를 바랄 수 있습니다. 파일에서 특정 행을 찾는 모든 메소드는 해당 행까지 모든 데이터를 읽어야합니다.

큰 파일을 한 줄씩 파싱하는 스크립트가 있습니다. 처리 할 수없는 오류가 발생하면 중지되어 마지막 행을 구문 분석합니다.

이 파일이 실제로 파일의 특정 줄을 찾는 최선의 방법일까요? ( fseek() 내 경우에는 사용할 수 없습니다.)

<?php

for ($i = 0; $i < 100000; $i++)
    fgets($fp); // just discard this

나는 이것을 사용하는 데 문제가 없다, 그것은 충분히 빠르다 - 그것은 단지 약간 더럽다고 느낀다. 기본 코드에 대해 내가 아는 바로는, 이것을 수행하는 더 좋은 방법이 있다고 상상하지 못합니다.


나는 그것이 게시를 위해 늦었다는 것을 알고있다. 그러나 그것은 언젠가 fseekbyline과 같은 기능을했던 몇몇 ppl을 도울 수있다 ...

function GoToLine($handle,$line)
{
  fseek($handle,0);  // seek to 0
  $i = 0;
  $bufcarac = 0;                    

  for($i = 1;$i<$line;$i++)
  {
    $ligne = fgets($handle);
    $bufcarac += strlen($ligne);  // in the end bufcarac will contains all caracters until the line
  }  

  fseek($handle,$bufcarac);
}

오류 시스템이 없습니다. <1 또는 203 행에 있지만 파일이 비어 있다면 ... 아무 것도 얻을 수 없습니다.

너가 eot에서 나가고 싶으면 같은


파일의 특정 행을 찾는 쉬운 방법은 SplFileObject 클래스를 사용하는 SplFileObject 클래스는 행 번호 ( seek() ) 또는 바이트 오프셋 ( fseek() )을 찾는 것을 지원합니다.

$file = new SplFileObject('myfile.txt');
$file->seek(9999);     // Seek to line no. 10,000
echo $file->current(); // Print contents of that line

백그라운드에서 seek() 은 PHP 코드가했던 것을 수행합니다 (C 코드 제외).


rewind($handle);
while($i=0; $i<$desired_line; i++)
    fgetcsv($handle, 1000, ",")

스크립트에서 특정 줄로 여러 번 되감기해야하는 동안이 기능이 작동합니다.

나는 이것이 기억이나 속도를 먹는 지 모르지만 트릭을한다.





fgets