Intereting Posts
Вызовите внешнюю функцию API от контроллера, LARAVEL 4 Что такое эквивалент PHP статической переменной на других языках? Как изменить этот код ajax на длительный опрос Laravel 5.1 – HHVM – исключение S3 в WrappedHttpHandler.php строка 152 Есть ли заголовок referrer при использовании SSL? Мне нужна помощь в изменении регулярного выражения для уценки PHP Push-уведомление не получает на iphone Шифрование пользовательских данных для автоматического входа в систему сторонних производителей PHP / Curl: проверка заголовков ответов перед загрузкой тела SilverStripe 3.1 – Создание и публикация страницы с FrontEnd PHP для отображения по умолчанию (вызов или массив?) Как остановить автоматические ротации изображений iMagick на основе данных ориентации EXIF Профилирующий код по производству Добавить атрибут объекта в PHP Woocommerce: пользовательская цена, основанная на пользовательском вводе

fseek () по строке, а не байтам?

У меня есть скрипт, который анализирует большие файлы по строкам. Когда он сталкивается с ошибкой, с которой он не может справиться, он останавливается, уведомляя нас о последней анализируемой строке.

Это действительно лучший / единственный способ поиска определенной строки в файле? ( fseek() не применим в моем случае.)

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

У меня нет проблем с этим, он достаточно быстр – он просто чувствует себя немного грязным. Из того, что я знаю о базовом коде, я не думаю, что есть лучший способ сделать это.

Легкий способ поиска определенной строки в файле – использовать класс 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).

Если у вас есть только номер строки, вы можете найти другую линию поиска. Файлы не основаны на линиях (или даже на основе символов), поэтому нет возможности просто перейти к определенной строке в файле.

Могут быть другие способы чтения строк в файле, которые могут быть немного быстрее, например, чтение больших фрагментов файла в буфер и чтение строк из этого, но вы можете только надеяться, что это будет на несколько процентов быстрее. Любой способ найти определенную строку в файле все равно должен прочитать все данные до этой строки.

Я знаю, что поздно публиковать, но это может помочь некоторым ppl. Я сделал функцию, например, fseekbyline в один прекрасный день …

 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, но файл пуст … вы ничего не получите.

то же самое, если вы хотите выйти из дома

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

Это работает для меня, в то время как мне нужно перематывать в определенную строку несколько раз в моем скрипте.

Я не уверен, что это поглощает память или скорость, но это делает трюк.

Если я правильно понимаю, вы хотите найти конкретную строку в какой-то момент после того, как нашли ошибку. Если это так, вы, вероятно, храните или печатаете номер строки плохой линии где-то, в зависимости от того, что вы подразумеваете под «уведомлять».

Если вы действительно не имеете в виду, что вы не можете использовать fseek() *, то вы можете также сохранить / распечатать позицию в файле, где начинается неправильная строка. Затем вы можете fseek() .

* Как в таком случае fseekbyline() можно использовать, если он существует?