php 파일 줄이 아닌 바이트 단위의 fseek()?




lseek (4)

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

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

<?php

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

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


파일의 특정 행을 찾는 쉬운 방법은 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 코드 제외).


내가 올바르게 이해하면 오류를 발견 한 후 어느 시점에서 특정 라인을 찾고 싶습니다. 이 경우, "알림"의 의미에 따라 아마도 불량 라인의 라인 번호를 어딘가에 저장하거나 인쇄 할 수 있습니다.

fseek() *를 사용할 수 없다는 것을 의미하지 않는 한, 잘못된 행이 시작되는 파일의 위치를 ​​저장 / 인쇄하는 것입니다. 그러면 fseek() 할 수 있습니다.

* fseekbyline() 이 존재한다면 어떻게 사용할 수 있습니까?


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

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

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


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

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





fgets