У меня есть скрипт, который анализирует большие файлы по строкам. Когда он сталкивается с ошибкой, с которой он не может справиться, он останавливается, уведомляя нас о последней анализируемой строке.
Это действительно лучший / единственный способ поиска определенной строки в файле? ( 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()
можно использовать, если он существует?