Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как удалить из файла строку, не зная её номера...
 
 автор: Владимир22   (04.06.2006 в 19:51)   письмо автору
 
 

Как удалить из файла строку, не зная её номера, но зная её текст.
Например, есть файл и строка:

$file = "list.txt";
$string = "Это строка, которую надо удалить";

Как опознать и удалить?
Кол-во строк в файле неизвестно, при удалении строку надо именно удалить, соответственно все строки, идущие за ней, должны сдвинуться вверх.

   
 
 автор: valenok   (04.06.2006 в 20:01)   письмо автору
 
   для: Владимир22   (04.06.2006 в 19:51)
 

[поправлено модератором]

   
 
 автор: Владимир22   (04.06.2006 в 20:28)   письмо автору
 
   для: valenok   (04.06.2006 в 20:01)
 

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

   
 
 автор: valenok   (04.06.2006 в 20:47)   письмо автору
 
   для: Владимир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 -- Читает содержимое файла и помещает его в массив

Мне больше нравится второй вариант.
Ещё одна наша тайна (может стоить узнать что такое бинарные данные и что за их безопасное чтение....)

Работает примерно так:

$array=file($handler);


Круто - до сех пор у нас в массиве есть все строчки файла...
Дальше поробуй также сам.

P.S. - ну если нету таких функций которые могут решить прогблемы на практике - ты чточно книги по пхп читал?

   
 
 автор: ec_stasis   (04.06.2006 в 20:52)   письмо автору
 
   для: valenok   (04.06.2006 в 20:47)
 

валенок, подскажи где почитать про бинарно-безопасное чтение... ;)

   
 
 автор: ec_stasis   (04.06.2006 в 20:49)   письмо автору
 
   для: Владимир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);

   
 
 автор: Владимир22   (04.06.2006 в 21:35)   письмо автору
 
   для: ec_stasis   (04.06.2006 в 20:49)
 

А зачем в этом коде файл "tmp.txt"? Может я неправильно объяснил задачу - надо удалить строку из файла "list.txt" - все остальные строки в файле должны остаться и никаких новых файлов "tmp.txt" создавать не надо. Может я чего-то нее понял, тогда буду признателен за комментарии.

   
 
 автор: ec_stasis   (04.06.2006 в 21:41)   письмо автору
 
   для: Владимир22   (04.06.2006 в 21:35)
 

В любом языке программирования строка из файла удаляется путем переписывания всех "нужных" строк в другой (временный) файл, а затем переименовывания этого другого файла в имя исходного. В пердложенном валенком варианте временный файл не создается, но принцип тот же - все строки, кроме удаляемой, записываются заново в тот же самый файл.

   
 
 автор: ec_stasis   (04.06.2006 в 21:44)   письмо автору
 
   для: ec_stasis   (04.06.2006 в 21:41)
 

только там опечаточка вышла: в последней строке скрипта $f надо заменить на $file(имя файла, из которого удаляется строка)

И если бы ты даже знал номер строки, все равно удалял бы этим способом. Так как другого просто нет...

   
 
 автор: Владимир22   (04.06.2006 в 21:54)   письмо автору
 
   для: 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); 
?> 

   
 
 автор: Shorr Kan   (04.06.2006 в 22:13)   письмо автору
 
   для: Владимир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 будет написана строка, которую надо удалить.

   
 
 автор: Владимир22   (04.06.2006 в 22:41)   письмо автору
 
   для: Shorr Kan   (04.06.2006 в 22:13)
 

Удаляет весь файл и оставляет точку в первой строке в начале...

   
 
 автор: ec_stasis   (04.06.2006 в 22:45)   письмо автору
 
   для: Владимир22   (04.06.2006 в 21:54)
 

Ну да, unlink() забыл написать, не удаляется возможно потому, что строка читается вместе с переводом строки в конце, я точно не помню, попробуй

<?
...
 if (
trim($str) != $string
...

или

<?
...
 if (
trim($str) != $string."\n"
...

   
 
 автор: ec_stasis   (04.06.2006 в 22:50)   письмо автору
 
   для: Владимир22   (04.06.2006 в 21:54)
 

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

   
 
 автор: valenok   (04.06.2006 в 23:59)   письмо автору
 
   для: ec_stasis   (04.06.2006 в 22:50)
 

[поправлено модератором]

   
 
 автор: Владимир22   (05.06.2006 в 01:46)   письмо автору
 
   для: 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 .........

   
 
 автор: cheops   (05.06.2006 в 03:39)   письмо автору
 
   для: Владимир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($himplode("",$file));
  
fclose($h
?>

   
 
 автор: Владимир22   (05.06.2006 в 14:13)   письмо автору
 
   для: cheops   (05.06.2006 в 03:39)
 

Спасибо! Наконец-то всё заработало как надо, а то промучился несколько дней. Благодарю Вас!

   
 
 автор: kolik   (05.06.2006 в 17:51)   письмо автору
 
   для: Владимир22   (04.06.2006 в 19:51)
 

Чипсы, а что делает функция "unset"?

   
 
 автор: Ziq   (05.06.2006 в 19:18)   письмо автору
 
   для: 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
?> 

   
 
 автор: valenok   (05.06.2006 в 19:28)   письмо автору
 
   для: Ziq   (05.06.2006 в 19:18)
 

ошибка

   
 
 автор: kolik   (06.06.2006 в 08:17)   письмо автору
 
   для: valenok   (05.06.2006 в 19:28)
 

Ну так скажи как правильно.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования