Php удаление строки из файла


Удаление строки из файла

Я очень часто встречаю вопрос типа «Как удалить определенную строку из файла?». Народ совсем не хочет шевелиться, ведь так легко зайти на любой крупный форум по PHP, и в сроке поиска написать что-то типа «Удаление строк из файла». Пятерка результатов гарантирована. Итак, мы как раз рассмотрим способ удаления определенной строки из текстового файла

Для начала было бы совсем не плохо создать текстовый файл. Назовём его file.txt, который будет состоять из строк, которые мы будем удалять:

Затем создаём что-нибудь типа file.php, занимающий около 11 строк!

Сначала определимся, что для удаления определенной строки нам нужен её номер. Его мы будем передавать с идентификатором >

  • функция file() считывает весь файл в массив (каждая строка — это его элемент);
  • $id-вычитает один из нашего идентификатора, так что 2 становится 2, а 3 — 3;
  • unset($file[$i]) удаляет или обнуляет элемент массива (но только из памяти, т. е. виртуально:);
  • implode() объединяет массив в одну строку. Это очень важно, так как если бы это опустили, наш файл бы похудел до бесполезной записи Array;

Как удалить строку из файла с помощью php?

У меня есть файл с именем $dir и строка с именем $line , я знаю, что эта строка является полной строкой этого файла, но я не знаю его номер строки, и я хочу удалить ее из файла, что я должен делать?

Можно ли использовать awk?

Прочитайте строки один за другим и напишите все, кроме строки соответствия, в другой файл. Затем замените исходный файл.

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

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

Это также хорошо, если вы ищете подстроку (ID) в строке и хотите заменить старую строку новой строкой.

Код:

Пример:

input: «123, student»

Запуск кода изменит файл на:

Я думаю, что лучший способ работать с файлами — редактировать их как строки.

Сначала возьмите все строки файла (следующие коды можно сжать):

Здесь вы можете выполнить поиск:

Просто вы можете удалить строку $key + 1:

Наконец, вы должны сохранить свои изменения в файле:

Также вы можете установить выше код как функцию.

Примечания:

$строка не должна содержать новых строк, таких как \n. Вы должны удалить их:

потому что первый случай не удаляет строку, он просто очищает строку (и останется ненужная пустая строка). В этом случае implode() добавляет новую строку также для $fileLineByLine [$ key], который пуст; в противном случае, если вы отключите переменную, она будет недоступна (и implode() не сможет ее найти).

Php: удалить строку из текстового файла

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

Нам НЕ разрешалось использовать встроенные функции сортировки или такие функции, как str_replace или подобный код.

Вот текущий код для удаления строки:

Код выводит ошибку T_IS_NOT_EQUAL в коде после исследования ошибки. Данные поступают как прямые данные из файла (), поэтому он должен работать. Ошибка указывает на for($i = 0; ($i настоящее время, но, вероятно, также ссылается на подобное вхождение в коде.

Данные вводятся в формате:

Мне также нужно иметь возможность обрабатывать, если встречаются несколько экземпляров упомянутого имени, скажем, так:

Это удалит один экземпляр, а не все, в случаях, подобных этому.

Любая помощь приветствуется, спасибо за ваше время заранее.

Пользователь введет имя человека (в формате выше), и это приведет к удалению человека. Скажите, что они вводят в форму:

Вывод кода в этом примере удалит «Matthew person person@email.com»

Таким образом, вывод в текстовом файле будет выводить:

Редактировать 2: код в его текущем состоянии

Удаление строки из текстового файла php

Я пытаюсь перечислить все строки в текстовом файле и нажать кнопку «Удалить» рядом с каждым. Когда кнопка нажата, эта строка должна быть удалена. как ниже

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

Один из подходов может заключаться в том, чтобы запросить сервер с удаляемой строкой, если ни одна строка не может быть равна другой, например, delete.php?str= и сделать удаление этой строки (обратите внимание, что я сказал «строка» не строка).


Если возможно, чтобы линии были равными, вы должны идентифицировать линии и следовать аналогичному подходу: delete.php?line= .

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

Изменить: пример приведен ниже, если вы советуете использовать скрытое поле.

Как удалить строку из файла с помощью php?

У меня есть файл с именем $dir и строка с именем $line , я знаю, что эта строка является полной строкой этого файла, но я не знаю его номер строки, и я хочу удалить ее из файла, что мне делать?

Илон Маск рекомендует:  Что такое код mcal_event_set_title

Можно ли использовать awk?

Прочитайте строки один за другим и напишите все, кроме строки соответствия, в другой файл. Затем замените исходный файл.

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

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

Это также хорошо, если вы ищете подстроку (ID) в строке и хотите заменить старую строку новой строкой.

Код:

Пример:

вход: «123, студент»

Запуск кода изменит файл на:

Я думаю, что лучший способ работать с файлами – редактировать их как строки.

Во-первых, получите все строки файла (следующие коды можно сжать):

Здесь вы можете выполнить поиск:

Просто вы можете удалить строку $ key + 1:

Наконец, вы должны сохранить свои изменения в файле:

Также вы можете установить выше код как функцию.

Заметки:

$ line не должно иметь новых символов строки, таких как \ n. Вы должны удалить их:

потому что первый случай не удаляет строку, он просто очищает строку (и останется ненужная пустая строка). В этом случае implode () добавляет новую строку также для $ fileLineByLine [$ key], который пуст; иначе, если вы отключите переменную, она будет недоступна (и implode () не сможет ее найти).

Php: удаление строки из файла

Недавно понадобилось мне удалить строку из файла. Так как ранее о записи в файл я имел весьма смутное представление, решил немного погуглить. Вариантов выдало много, но все они были однотипные, видимо, кто-то один придумал, а остальные лишь подхватили данное решение, каждый добавив что–то свое: ну, типа, рерайт. Меня же во всех этих примерах не устраивало несколько обстоятельств: там везде был задействован цикл for , нигде, ни в одном из примеров, не была учтена буферизация (запись в файл по 8кб), что при нагруженности ресурса и одновременно нескольких потоках записи могло бы привести к «микшированию» данных: то есть, 8кб от одного потока, 8кб от другого, затем опять 8кб от первого. Практически ни в одном из найденных примеров не была реализована блокировка файла во время записи, что также могло привести к потере данных (всех или части). Ко всему прочему, почти во всех примерах использовалась языковая конструкция unset() , хотя почти во всех случаях работа шла с элементами массива. А что у нас самое лучшее для перебора массивов в пэхапэ? Правильно, конструкция foreach . Доказано, что эта конструкция работает с массивами быстрее, чем, например, for (пруф). Именно поэтому я и решил написать свой велосипед удаления строки из файла, а ты уж сам решай, уважаемый читатель, кто прав, а кто виноват.

Итак, пример будет реальный. Возьмем для записи файл .htaccess , чтобы максимально обострить чувство опасности при работе с ним. Например наш файл имеет такое содержимое:

Что бы нам удалить? Ну давайте, например, RewriteEngine on . Далее пойдет немного кода, безусловно, с подробными пояснениями:

Если мы «раздампим» после explode() переменную $lines , то увидим примерно такую структуру массива:

То есть нужное нам значение имеет ключ 4 (не забываем, что отсчет начинается с 0). Но это так, для наглядности.

Вот и все. В итоге после записи в файл мы получим

То есть, нужная нам строка будет успешно удалена, а файл безопасно перезаписан. Если мы вместо оператора (управляющей конструкции) continue; используем оператор break; , то цикл остановится на нужном нам значении массива и данные, которые будут ниже искомого значения (в том числе и оно) не запишутся: кому–то может понадобиться именно такой вариант.

Php: удаление строки из файла

Для начала было бы совсем не плохо создать текстовый файл. Назовём его file.txt, который будет состоять из строк, которые мы будем удалять:

строка один
строка два
строка три
строка четыре
строка пять

Затем создаём что-нибудь типа file.php, занимающий около 11 строк!

Сначала определимся, что для удаления определенной строки нам нужен её номер. Его мы будем передавать с идентификатором >

— функция file() считывает весь файл в массив (каждая строка — это его элемент);
— $id-вычитает один из нашего идентификатора, так что 2 становится 2, а 3 — 3;
— unset($file[$i]) удаляет или обнуляет элемент массива (но только из памяти, т. е. виртуально:);
— implode() объединяет массив в одну строку. Это очень важно, так как если бы это опустили, наш файл бы похудел до бесполезной записи Array.

Как удалить концы строк из текста средствами РНР

Задача удаления концов строчек из (многострочной) строки текста бывает обусловлена, к примеру, когда такая строка прочитана из текстового файла. В этой статье рассмотрим, насколько эффективны различные способы такого удаления.

Символы концов строк

В операционной системе Linux конец строки обозначается символом \n (или LF ), а в Windows – двумя символами: \r \n ( CR LF ). Обратите внимание, что слеш \ и идущая после него буква ( r или n ) является ОДНИМ байтом (т.е. 1 байт), хотя для его обозначения требуется ДВА текстовых символа.

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

Способы удаления концов строк


Рассмотрим наиболее известные пять способов (функции) для удаления концов строк:

1. str_replace(array(«\r\n», «\r», «\n»), », $string[$i]); — для каждой из строчек (записанных в массив) по отдельности, в цикле

2. str_replace(array(«\r\n», «\r», «\n»), », $string); — из всего содержимого файла, как одной строки

3. rtrim($string); — специальная функция для удаления концов строк (а также табуляции, пробелов в конце строк)

4. preg_replace(‘/[\r\n]/’, », $string); — функция удаления концов строк, использующая регулярное выражение для всего содержимого файла, как одной строки

5. preg_replace(‘/[\r\n]/’, », $string); — функция удаления концов строк, использующая регулярное выражение для каждой из строчек (записанных в массив) по отдельности, в цикле

Илон Маск рекомендует:  Что такое код gzputs

1. Функция str_replace

Эта функция производит замену символов концов строк везде во всей строке. Ее можно использовать как построчно (если текстовый файл был читан при помощи функции file() , которая каждую строчку записывает в соответствующий элемент массива), так и применительно к строке в целом (если файл был считан при помощи функции file_get_contents() в виде единой строки, содержащей, однако, символы \r , \n ).

2. Функция rtrim()

Она предназначена СПЕЦИАЛЬНО для того, чтобы удалять концы строк (т.е. символы \r , \n ) из текстовой строки. Ее можно применить, если файл был считан в построчном режиме. Тогда как, если он считан в виде единой строки – применение ее напрямую невозможно.

3. Функция preg_replace()

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

Программный код

Для тестирования различных подходов использовался следующий программный код на РНР:

for($j=0; $j
for ($i = 0; $i
echo ‘time1 (str_replace)=’ . $time1[$j] . ‘ ‘ . ‘time2 (rtrim)=’ . $time2[$j] . ‘
‘;
>
//echo implode(», $file_arr1) .’

‘;
//echo implode(», $file_arr2) .’

‘;
$time1_all=0;
$time2_all=0;
for($j=0; $j
$str = file_get_contents($_SERVER[‘DOCUMENT_ROOT’] . ‘/’ . ‘Sitemap.xml’);
$t = microtime();
for($j=0; $j
$str = file_get_contents($_SERVER[‘DOCUMENT_ROOT’] . ‘/’ . ‘Sitemap.xml’);
$t = microtime();
for($j=0; $j
$file_arr5 = file($_SERVER[‘DOCUMENT_ROOT’] . ‘/’ . ‘Sitemap.xml’);
$file_arr_len5 = sizeof($file_arr5);
for($j=0; $j
echo ‘
time1_all (array, str_replace)=’.$time1_all.’ ‘.’
time2_all (array, rtrim)=’.$time2_all.’ ‘.’
time3_all (string, str_replace)=’.$time3_all . ‘
time4_all (string, preg_replace)=’.$time4_all. ‘
time5_all (array, preg_replace)=’.$time5_all ;
?>

Как видно, этот код последовательно удаляет концы строк из содержимого, считанного из файла. Для примера, взят файл карты сайта Sitemap.xml, находящийся в корневом каталоге сайта. Этот файл имел размер 59,7 кБ, содержал 2250 строчек.

Каждый из четырех способов удаления концов строк, для статистики, применяется 20 раз. Затем результаты усредняются. И вот что получилось:

time1_all (array, str_replace)=0.0055
time2_all (array, rtrim)=0.0027
time3_all (string, str_replace)=0.0021
time4_all (string, preg_replace)=0.0235
time5_all (array, preg_replace)=0.0064

Самым быстрым оказался, как ни странно, третий способ. Это когда файл был прочитан в строку при помощи функции file_get_contents() , а затем концы строчек, содержащиеся в ней, были удалены при помощи str_replace .

Немного медленнее работает функция rtrim() , примененная к содержимому файла, считанного в массив (состоящий из отдельных строчек) и уже из его элементов, в цикле, удалялись концы строчек. По-видимому, несколько более медленная работа функции rtrim() , в данном случае, связана с массивом. А он имел не очень малый размер — состоял из 2250 элементов.

Тогда как в аналогичном цикле, функция str_replace() показала в 2 раза более медленный результат.

Ну, а что касается регулярного выражения, примененного к содержимому файла в целом, тут даже и говорить не приходится: время выполнения увеличилось на порядок! Хотя, при разбиении файла на строчки и создании соответствующего массива, функция preg_replace() работает быстрее. Но, даже и в этом случае – чисто строковые функции (без регулярных выражений) работают быстрее.

Выводы

Итак, наверное, банально, но, все же, стоит отметить:

Обобщение

Отметим, что данные выводы, скорее всего, справедливы не только для языка PHP, но и для многих других аналогичных языков, например, Python, C#, Ruby . Т.е. для высокоуровневых языков. Потому, что в этих языках команды, по сути, представляют собой, всего-навсего, набор готовых скриптов той или иной степени эффективности. Написанных на языке С/С++ .

Поэтому целесообразнее применять именно ту функцию, которая как раз и предназначена для выполнения соответствующей задачи, взамен более универсальной функции. Правда, из этого правила бывают исключения. Как видим, в третьем варианте универсальная функция str_replace() сработала, все-таки, быстрее специализированной rtrim() . Кстати, такой же парадокс наблюдается и для специализированной функции file() : она работает, как ни странно, раза в 2 медленнее, чем пара функций fopen() + explode() .

А вот для программ на С/С++ — разница, видимо, будет не столь заметна.

Что касается регулярных выражений, то, как видно, чем меньше размер строки (на каждой итерации цикла), тем быстрее происходит обработка. По результатам тестирования получилось, что разбиение содержимого, считанного из файла, в массив (построчно) показало гораздо более лучший (в смысле быстроты обработки) результат, по сравнению с обработкой содержимого файла как одной цельной строки (тогда как при использовании str_replace() — все полностью наоборот). При этом, что интересно, время работы функции preg_replace() ненамного выше, чем время работы функции str_replace() , хотя последняя, вроде как, работает с «чистыми» строками, без использования регулярных выражений.

В целом же, можно сделать такой вывод

. Не стоит использовать первую попавшуюся функцию в РНР только потому, что она присутствует в этом языке и кем-то рекомендована. Если, конечно, вебразработчика интересует быстрота работы программы на PHP, равно как и скорость открытия страниц сайта в целом. Если в конкретной ситуации язык дает несколько возможностей для решения одной и той же задачи (т.е. если возможно применить разные функции), то, чтобы сайт функционировал наиболее быстро, следует, увы, тестировать, как работает каждая из функций и выбирать наиболее оптимальную. Да, вывод этот, конечно, банальный. Однако, скорость работы функций РНР в маннуалах не прописана. Да и на форумах компьютерных этот вопрос, зачастую, как-то обходят стороной. Работает мол (как-то там), да и ладно. Так что выход здесь один: практическое тестирование функциональности/скорости. Не обращая внимания на маннуалы.

Понятно, что для небольших сайтов, при обработке сравнительно небольших строк, слабой нагруженности сайта, в самом деле, нет смысла что-то там оптимизировать и вылавливать эти доли секунд. В самом деле, какая разница — выполнится некая операция то ли за 0,002 секунды, то ли за 0,02 секунды? Все равно, мол, очень быстро. Но, по мере развития сайта, по мере роста посещаемости — все эти, казалось бы, мелочи, в итоге, сложившись, могут дать существенное замедление скорости работы сайта. И, как следствие — падение позиций в поисковиках, появление определенных, не особенно приятных, чувств к такому сайту у пользователей. Кто-то в подобной ситуации может начать думать в направлении, мол, более мощного сервера. А лучше бы, в первую очередь, выбирать оптимальные, для каждого случая, функции.

Илон Маск рекомендует:  Dec - Процедура Delphi

Правда, озвученный выше подход, скорее всего, ОЧЕНЬ не понравится так называемым любителям «командной работы». Ну, это когда «команда» состоит из (бывших) студентов-троечников, каждый из которых является, так сказать, «узким специалистом» (ну, т.е. таким, который освоил лишь что-то одно, да и то — на минимальном уровне). И/или когда принцип работы «команды» — примерно такой: программистам — определенная зарплата (ну, быть может, плюс некие премии), а руководству — все остальные финансы и доходы.

Как удалить строку из файла с помощью php?

У меня есть файл с именем $dir и строка с именем $line , я знаю, что эта строка является полной строкой этого файла, но я не знаю его номер строки и хочу удалить его из файла, что мне делать?

Можно ли использовать awk?

Прочитайте строки одну за другой и запишите все, кроме соответствующей строки, в другой файл. Затем замените оригинальный файл.

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

Другой подход состоит в том, чтобы читать файл построчно, пока не найдете совпадение, затем обрезать файл до этой точки, а затем добавить остальные строки.

Это может быть решено без использования awk:

Это также хорошо, если вы ищете подстроку (ID) в строке и хотите заменить старую строку новой строкой.


Код:

Пример:

вход: «123, студент»

Запуск кода изменит файл на:

Я думаю, что лучший способ работы с файлами — это редактировать их как строки.

Сначала получите все строки файла (следующие коды могут быть сжаты):

Здесь вы можете выполнить поиск:

Просто вы можете удалить строку $ key + 1:

Наконец, вы должны сохранить ваши изменения в файл:

Также вы можете установить вышеуказанный код как функцию.

Заметки:

В $ line не должно быть символов новой строки, таких как\n. Вы должны удалить их:

поскольку первый случай не удаляет строку, он просто очищает строку (и нежелательная пустая строка останется). В этом случае implode () добавляет новую строку также для $ fileLineByLine [$ key], которая является пустой; в противном случае, если вы сбросите переменную, она будет недоступна (и implode () не сможет ее найти).

Php: удаление строки из файла

Есть функция для удаления текстовой строки из файла.

PHP
function delinfo ( $id , $filecont ) <
$file = file ( $filecont );
$fp = fopen ( $filecont , «w» );
flock ( $fp , LOCK_EX );
for ( $i = 0 ; $i sizeof ( $file ); $i ++) < if ( $i == $id ) >
fputs ( $fp , implode ( «» , $file ));
flock ( $fp , LOCK_UN );
fclose ( $fp );
@ chmod ( «$filecont» , 0644 );
>

Работает замечательно. Но удаляет только одну строку за раз.

И есть массив произвольных переменных (в них номера строк) $form[$i], считанных с формы.

Как мне усовершенствовать функцию что-бы она принимала в качестве первой переменной массив $form[$i], и удаляла несколько строк разом, без смещения?

Куда приделать цикл?

самый простой вариант

PHP
$a = array( 1 , 4 , 6 );
foreach( $a as $v )
<
delinfo ( $v , $filecont );
>

Спасибо. А не подскажите как превратить $area[$i] в array(n1, n2, ..nn)?
А то я в массивах не очень силен

Мне кажется если функцию пускать по циклу то будет происходить смещение строк. т.е если, например, строку n3 удалили то при перзаписи файла все последующие строки изменят свой номер — т.е. уменьшаться на 1. Например n7 станет n6 и т.д.

так что цикл нужно вносить внутрь функции

Так и происходит — если пустить функцию по циклу то строки удаляются со смещением

Цикл надо ввести в функцию до перезаписи файла — только не врубаюсь куда конкретно

Цитата (LRCenter @ 26.03.2009 — 22:59)
строки удаляются со смещением

Если я правильно понял задачу, то следующий код подойдет.

PHP
$filename = ‘test.txt’ ; // файл
$delete = array( 0 , 2 , 5 ); // номера строк, которые удаляем

$file = file ( $filename , FILE_IGNORE_NEW_LINES );
while(list( $line , $data ) = each ( $file ))
<
if( in_array ( $line , $delete ))
$file [ $line ] = null ;
>
file_put_contents ( $filename , implode ( «\n» , $file ), LOCK_EX );
unset( $file );

Цитата (LRCenter @ 27.03.2009 — 00:23)
упс. а у меня 4-ка.
Цитата (LRCenter @ 27.03.2009 — 02:02)
А не подскажете как вписать массив переменных вида $form[$i] в этот код вместо array(0, 2, 5)?

Типа из формы значения принять?

Вот так, если в каждом поле по значению

HTML
form method =» post » action=» script. php «>
input size =» 2 » name=» line[] » />
input size =» 2 » name=» line[] » />
input size =» 2 » name=» line[] » />
input size =» 2 » name=» line[] » />
.
/form >
PHP
//.
$delete = $_POST [ ‘line’ ];
//.

или так если значения строк будут задаваться через запятую:

HTML
form method =» post » action=» script. php «>
input size =» 2 » name=» lines » />
.
/form >
PHP
$delete = array();
$lines = explode ( ‘,’ , $_POST [ ‘lines’ ]);
for( $i = 0 , $c = count ( $lines ); $i $c ; $i ++)
<
$line_value = trim ( $lines [ $i ]);
if(!empty( $line_value ))
$delete [] = $line_value ;
>
unset( $lines );
Цитата (LRCenter @ 27.03.2009 — 07:04)
а как можно удалить ее полностью, т.е. чтоб вместо нее не оставалось пустой строки?
Цитата (LRCenter @ 26.03.2009 — 22:59)
если пустить функцию по циклу то строки удаляются со смещением

тоесть удалять строки без смещения? Или нет?
В любом случае:

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL