Php прочитать последнюю строку файла
в моем приложении PHP мне нужно чтение нескольких строк, начиная с конца много файлов (преимущественно журналы). Иногда мне нужен только последний, иногда мне нужен . десятки или сотни. В принципе, я хочу что-то гибкое, как Unix tail команда.
здесь есть вопросы о том, как получить последнюю строку из файла (но Мне нужно N lines), и были даны различные решения. Я не уверен, что один из лучших и что выступить лучше.
Количество символов
Получить количество вхождений подстроки
Список изменений
Версия | Описание |
---|---|
4.3.0 | fgets() теперь безопасна для обработки бинарных данных |
Поиск
Получить количество переносов в строке
Добавление в строки
Добавить строку после 10-го символа:
Добавить перед словом:
Добавить после слова:
Получить длину строки
Функция strlen($string) возвращает длину строки, но возвращает неправильный результат если в строке есть кириллица в UTF-8, поэтому нужно использовать mb_strlen() .
Вставить строку между всех символов
Для того чтобы вставить символ между всех символов в строке понадобится функция str_split($string) для пробразавания строки в массив, она также не работает с кирилицей. С версии PHP 7.4 появилась функция mb_str_split() , для более ранних версий:
19 Answers 19
For a large file, reading all the lines into an array with file() is a bit wasteful. Here's how you could read the file and maintain a buffer of the last 5 lines:
You could optimize this a bit more with some heuristics about likely line length by seeking to a position, say, approx 10 lines from the end, and going further back if that doesn't yield 5 lines. Here's a simple implementation which demonstrates that:
@Paual Dixon, In while loop you read all line and store last X line. is it possible to read last X lines?
Untested code, but should work:
Calling max will handle the file being less than 6 lines.
this is good , but need note a Critical issues. that is $i may be less than 0; so you need this if ($i > 0) echo .
The terrible code in terms of memory usage. It puts the whole file in memory. If that file will be super big you are in trouble.
If you're on a linux system you could do this:
Otherwise you'll have to count lines and take the last 5, something like:
The file array slice is not a great method for large memory files. tail is the direction I went with.
This will be fast for larger files but alot of code for a simple task, if there LARGE FILES, use this
Opening large files with file() can generate a large array, reserving a considerable chunk of memory.
You can reduce the memory cost with SplFileObject since it iterates through each line.
Use the seek method (of seekableiterator ) to fetch the last line. You should then subtract the current key value by 5.
To obtain the last line, use PHP_INT_MAX . (Yes, this is a workaround.)
This is a common interview question. Here's what I wrote last year when I was asked this question. Remember that code you get on Stack Overflow is licensed with the Creative Commons Share-Alike with attribution required.
This solution does make an assumption about the maximum line length. The interviewer asked me how I would solve the problem if I couldn't make that assumption, and had to accommodate lines that were potentially longer than any max length I chose.
I told him that any software project has to make certain assumptions, but I could test if $c was less than the desired number of lines, and if it isn't, fseek() back further incrementally (doubling each time) until we do get enough lines.
Примеры сохранения и чтения текстовых данных и массивов в файлы.
методы обзор
поиск в Интернете, я наткнулся на различные решения. Я могу их сгруппировать. в трех подходах:
- наивный С file() функции PHP;
- измена те, что работает в системе;
- могучий те, которые счастливо прыгать вокруг открытого файла с помощью fseek() .
в итоге я выбрал (или написал) пять решения,наивный один, a измена один и три могучий те.
все решения работа. В том смысле, что они возвращают ожидаемый результат от любой файл и любое количество строк, которые мы запрашиваем (за исключением решения №1, которое может разрыв ограничений памяти PHP в случае больших файлов, ничего не возвращающих). Но кто лучше?
Найти позицию последнего вхождения подстроки
Замена символов и слов в строке
Для этой задачи подходит функция str_replace($search, $replace, $subject), которая работает со всеми кодировками.
Заменить пробелы:
Заменить слово:
Заменить всё до дефиса:
Заменить всё после дефиса:
заключение
избежать Решение № 1 если вы следует читать файлы размером более 10 КБ.
Указатель на файл должен быть корректным и указывать на файл, успешно открытый функциями fopen() или fsockopen() (и все еще не закрытым функцией fclose() ).
Чтение заканчивается по достижении length - 1 байт, если встретилась новая строка (которая включается в возвращаемый результат) или конец файла (что встретилось первым). Если длина не указана, чтение из потока будет продолжаться до тех пор, пока не достигнет конца строки.
Замечание:
До версии PHP 4.3.0, опущение этого параметра означало, что длина строки будет равна 1024 символам. Если большинство строк в файле больше 8 килобайт, в целях производительности вашего скрипта стоит указать максимальную длину строки.
Количество пробелов в строке
Или количество вхождений любого другого символа или подстроки.
Количество пробелов в начале строки:
Количество пробелов в конце строки:
Примечания
Замечание: Если у вас возникают проблемы с распознаванием PHP концов строк при чтении или создании файлов на Macintosh-совместимом компьютере, включение опции auto_detect_line_endings может помочь решить проблему.
Замечание:
Программисты, привыкшие к семантике 'C' функции fgets() , должны принимать во внимание разницу в том, каким образом возвращается признак достижения конца файла (EOF).
I have a file named file.txt which is update by adding lines to it.
I am reading it by this code:
and a huge number of lines appears. I just want to echo the last 5 lines of the file
How can I do that ?
The file.txt is like this:
Середина строки
Получить второе слово:
Получить текст до дефиса:
Получить текст после дефиса:
Дописать строку до нужной длины
Функция str_pad($string, $length, $pad_string, $pad_type) дополняет строку другой строкой до заданной длины.
Количество знаков препинания
Количество цифр в строке
Примеры
$handle = @ fopen ( "/tmp/inputfile.txt" , "r" );
if ( $handle ) while (( $buffer = fgets ( $handle , 4096 )) !== false ) echo $buffer ;
>
if (! feof ( $handle )) echo "Error: unexpected fgets() fail\n" ;
>
fclose ( $handle );
>
?>?php
Извлечение из текста
Переносы строк
Получить первую строку:
Получить последнюю строку:
Возвращаемые значения
Возвращает строку размером в length - 1 байт, прочитанную из дескриптора файла, на который указывает параметр handle . Если данных для чтения больше нет, то возвращает FALSE .
В случае возникновения ошибки возвращает FALSE .
Сохранение в файл
Функция file_put_contents() записывает содержимое переменной в файл, если файла не существует. то пытается его создать, если существует то полностью перезапишет его.
File_put_contents:
Fopen / fwrite:
Набор функций fopen, fwrite, fclose предназначены для более гибкой работы с файлами.
- fopen – открытие или создание файла.
- fwrite – запись данных.
- fclose – закрытие файла.
Возможные режимы fopen():
Mode | Описание |
---|---|
r | Открывает файл только для чтения, помещает указатель в начало файла. |
r+ | Открывает файл для чтения и записи, помещает указатель в начало файла. |
w | Открывает файл только для записи, помещает указатель в начало файла и обрезает файл до нулевой длины. Если файл не существует – пробует его создать. |
w+ | Открывает файл для чтения и записи, помещает указатель в начало файла и обрезает файл до нулевой длины. Если файл не существует – пытается его создать. |
a | Открывает файл только для записи, помещает указатель в конец файла. Если файл не существует – пытается его создать. |
a+ | Открывает файл для чтения и записи, помещает указатель в конец файла. Если файл не существует – пытается его создать. |
x | Создаёт и открывает только для записи; помещает указатель в начало файла. Если файл уже существует, вызов fopen() закончится неудачей, вернёт false и выдаст ошибку. Если файл не существует, попытается его создать. |
x+ | Создаёт и открывает для чтения и записи, в остальном имеет то же поведение, что и « x ». |
c | Открывает файл только для записи. Если файл не существует, то он создаётся. Если же файл существует, то он не обрезается (в отличие от « w »), и вызов к этой функции не вызывает ошибку (также как и в случае с « x »). Указатель на файл будет установлен на начало файла. |
c+ | Открывает файл для чтения и записи, в остальном имеет то же поведение, что и « c ». |
Доступно в место fwrite() используют fputs() , разницы ни какой т.к. эта функция является псевдонимом.
Обзор PHP-функций для работы со строками и практическое их применение с учетом кодировки UTF-8.
Начало строки
Получить первый символ:
Получить три первых символа:
Получить первое слово:
Получить все после первого слова:
Количество букв в строке
тесты производительности
чтобы ответить на вопрос, я запускаю тесты. Вот как это бывает. сделано, не так ли?
я подготовил образец 100 КБ объединение различных файлов, найденных в мой . Тогда я написал PHP-скрипт, который использует каждый из пять решений для извлечения 1, 2, . 10, 20, . 100, 200, . 1000 строки из конца файла. Каждый тест повторяется десять раз (это что-то вроде 5 × 28 × 10 = 1400 испытаний), измерений средняя продолжительность время in микросекунды.
я запускаю скрипт на своей локальной машине разработки (Xubuntu 12.04, PHP 5.3.10, 2.70 GHz двухъядерный процессор, 2 ГБ ОЗУ) с помощью командной строки PHP переводчик. Вот результаты:
давайте попробуем с большим файлом. Что, если нам придется читать 10 МБ лог-файл?
и для крошечных файлов журнала? Это график для 10 КБ :
вы можете скачать все мои тестовые файлы, источники и результаты здесь.
Конец строки
Получить последний символ:
Получить три последних символа:
Получить последнее слово:
Получить всё до последнего слова:
Пилучить символы из ковычек и скобок
Найти позицию первого вхождения подстроки
Замена в строках
Функция substr_replace($search, $replace, $subject, $count) – заменяет часть строки, также не раотает с кирилицей в кодировке UTF-8, в библиатеке mb_string её нет, поэтому приходится использовать пользовольскую функцию:
Заменить первый символ:
Заменить три первых символа:
Заменить последний символ:
Заменить три последних символа:
Найти все вхождения подстроки
Количество слов с строке
Функция str_word_count() возвращает количество слов в строке, но символы обрамленные пробелами будет считаться за слово, например « - ». Так же функция не работает с UTF-8, как видно в примере:
Количество символов без пробелов
Читайте также: