| |
|
|
| | Как удалить из файла строку, не зная её номера, но зная её текст.
Например, есть файл и строка:
$file = "list.txt";
$string = "Это строка, которую надо удалить";
Как опознать и удалить?
Кол-во строк в файле неизвестно, при удалении строку надо именно удалить, соответственно все строки, идущие за ней, должны сдвинуться вверх. | |
| |
|
|
| |
|
|
| |
для: Владимир22
(04.06.2006 в 19:51)
| | | [поправлено модератором] | |
| |
|
|
| |
|
|
| |
для: valenok
(04.06.2006 в 20:01)
| | | Приветствую, valenok!
Я знаю много функций, так как перелопатил уже несколько учебников по PHP, однако не все они могут дать ответ на конкретные вопросы из практики. По поводу вышеприведённого кода, я испробовал уже массу вариантов и подходов, но не хочу здесь выкладывать нерабочие варианты, и засорять форум, поэтому и обратился к знатокам. | |
| |
|
|
| |
|
|
| |
для: Владимир22
(04.06.2006 в 20:28)
| | | выше приведённого кода я конечно не нашёл но ладно
давай так. На мой взгляд надо разбивать работу на составные.
В первый раз я могу это сделать за тебя
1. Обратиться к файлу
2. Найти в нём нужную информацию.
3. Стереть её
4. Закончить работу с файлом.
Какие функции могут тебе помочь в каждой из этих задач.
Вы все конечно можете со мной не согласиться - но я считаю что креативность и изобретательность являются одной из основопологающих элементов php которыми и надо пользоваться для решения ваших "вопросы из практики".
Для примера первый этап: 1. Обратиться к файлу
Функции : fopen,fread,file
Я больше функций не знаю (только это останется нашей профессиональной тайной, хорошо?)
Теперь план реализации:
1. Нужно открыть файл
2. Получить из него информацию.
Пробуем.
1.
$handler=fopen('text.txt');
|
2. дальше недо получить из него информацию:
Есть два варианта. какой больше подходит?
иду и проверяю.
fread --Бинарно-безопасное чтение файла
file -- Читает содержимое файла и помещает его в массив
Мне больше нравится второй вариант.
Ещё одна наша тайна (может стоить узнать что такое бинарные данные и что за их безопасное чтение....)
Работает примерно так:
Круто - до сех пор у нас в массиве есть все строчки файла...
Дальше поробуй также сам.
P.S. - ну если нету таких функций которые могут решить прогблемы на практике - ты чточно книги по пхп читал? | |
| |
|
|
| |
|
|
| |
для: valenok
(04.06.2006 в 20:47)
| | | валенок, подскажи где почитать про бинарно-безопасное чтение... ;) | |
| |
|
|
| |
|
|
| |
для: Владимир22
(04.06.2006 в 20:28)
| | |
<?
$file = "list.txt";
$string = "Это строка, которую надо удалить";
$ftmp = fopen('tmp.txt', 'w');
$f = fopen($file, 'r');
while (!feof($f)) {
$str = fgets($f);
if ($str != $string)
fwrite ($ftmp, $str);
}
fclose($f);
fclose($ftmp);
rename ('tmp.txt', $f);
|
| |
| |
|
|
| |
|
|
| |
для: ec_stasis
(04.06.2006 в 20:49)
| | | А зачем в этом коде файл "tmp.txt"? Может я неправильно объяснил задачу - надо удалить строку из файла "list.txt" - все остальные строки в файле должны остаться и никаких новых файлов "tmp.txt" создавать не надо. Может я чего-то нее понял, тогда буду признателен за комментарии. | |
| |
|
|
| |
|
|
| |
для: Владимир22
(04.06.2006 в 21:35)
| | | В любом языке программирования строка из файла удаляется путем переписывания всех "нужных" строк в другой (временный) файл, а затем переименовывания этого другого файла в имя исходного. В пердложенном валенком варианте временный файл не создается, но принцип тот же - все строки, кроме удаляемой, записываются заново в тот же самый файл. | |
| |
|
|
| |
|
|
| |
для: ec_stasis
(04.06.2006 в 21:41)
| | | только там опечаточка вышла: в последней строке скрипта $f надо заменить на $file(имя файла, из которого удаляется строка)
И если бы ты даже знал номер строки, все равно удалял бы этим способом. Так как другого просто нет... | |
| |
|
|
| |
|
|
| |
для: ec_stasis
(04.06.2006 в 21:44)
| | |
$file = "list.txt";
$string="Длинная нужная строка";
$ftmp = fopen('tmp.txt', 'w');
$f = fopen($file, 'r');
while (!feof($f)) {
$str = fgets($f);
if ($str != $string)
fwrite ($ftmp, $str);
}
fclose($f);
fclose($ftmp);
unlink ($file); // дописал, так как не переименовывался следующий файл
rename ('tmp.txt', $file);
|
Ничего не работает, строки не удаляются, хотя процесс происходит - файл создаётся и копируется, но копируется полностью как было.
Может есть вариант попроще и понадёжней?
-----------------------------------------------------
А по поводу удаления известной по номеру строки, то вот есть такой скрипт:
<?
$line="1"; # строка, которую нужно удалить
$file=file("my_file.txt");
$open=fopen("my_file.txt","w");
for($i=0;$i<count($file);$i++)
{
if(($i+1)!=$line){fwrite($open,$file[$i]);}
}
fclose($open);
?>
|
| |
| |
|
|
| |
|
|
| |
для: Владимир22
(04.06.2006 в 21:54)
| | | А вы его чуть измените... сравнивайте строки...
if(($i+1)!=$line){fwrite($open,$file[$i]);}
|
это определяет номер строки и удаляет.... А попробуйте
if(trim($file[$i])!=trim($line)){fwrite($open,$file[$i]);}
|
При условии, что в $line будет написана строка, которую надо удалить. | |
| |
|
|
| |
|
|
| |
для: Shorr Kan
(04.06.2006 в 22:13)
| | | Удаляет весь файл и оставляет точку в первой строке в начале... | |
| |
|
|
| |
|
|
| |
для: Владимир22
(04.06.2006 в 21:54)
| | | Ну да, unlink() забыл написать, не удаляется возможно потому, что строка читается вместе с переводом строки в конце, я точно не помню, попробуй
<?
...
if (trim($str) != $string)
...
|
или
<?
...
if (trim($str) != $string."\n")
...
|
| |
| |
|
|
| |
|
|
| |
для: Владимир22
(04.06.2006 в 21:54)
| | | я уже говорил, в любом случае перезаписывается весь файл заново, только использование этого способа дает большую вероятность возникновения проблем при одновременном обращении к файлу нескольких скриптов... | |
| |
|
|
| |
|
|
| |
для: ec_stasis
(04.06.2006 в 22:50)
| | | [поправлено модератором] | |
| |
|
|
| |
|
|
| |
для: valenok
(04.06.2006 в 23:59)
| | |
$file=file('text.txt');
$h=fopen('text.txt',"w")
for ($i=0;$i<count($file);$i++){
if($file[$i]==$string) {
continue; }
fputs ($h,$file[$i]);
fclose($h)
}
|
Либо стирает всё, либо пишет:
Warning: fputs(): 3 is not a valid stream resource in ......... | |
| |
|
|
| |
|
|
| |
для: Владимир22
(05.06.2006 в 01:46)
| | | Вы можете использовать следующее решение
<?php
$string = "ejhrfbv:::22";
$file = file('text.txt');
for ($i=0;$i<count($file);$i++)
{
if(trim($file[$i])==$string) unset($file[$i]);
}
print_r($file);
$h = fopen('text.txt',"w");
fwrite($h, implode("",$file));
fclose($h)
?>
|
| |
| |
|
|
| |
|
|
| |
для: cheops
(05.06.2006 в 03:39)
| | | Спасибо! Наконец-то всё заработало как надо, а то промучился несколько дней. Благодарю Вас! | |
| |
|
|
| |
|
|
| |
для: Владимир22
(04.06.2006 в 19:51)
| | | Чипсы, а что делает функция "unset"? | |
| |
|
|
| |
|
|
| |
для: kolik
(05.06.2006 в 17:51)
| | | По-моему, удаляет из оперативной памяти переменную. Т.е. полностью стирает и освобождает место, а не присваивает значение пустой строки.
Иногда еще используют функцию isset(). Вот пример из офиц. руководство, может станет пон6ятней.
<?
$a = "test";
$b = "anothertest";
var_dump(isset($a)); // TRUE
var_dump(isset($a, $b)); // TRUE
unset ($a);
var_dump(isset($a)); // FALSE
var_dump(isset($a, $b)); // FALSE
$foo = NULL;
var_dump(isset($foo)); // FALSE
?>
|
| |
| |
|
|
| |
|
|
| |
для: Ziq
(05.06.2006 в 19:18)
| | | ошибка | |
| |
|
|
| |
|
|
| |
для: valenok
(05.06.2006 в 19:28)
| | | Ну так скажи как правильно. | |
| |
|
|