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

Форум PHP

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

 

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

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

тема: удаление из файла по достижениии 0
 
 автор: посетитель   (06.05.2005 в 09:45)
 
 

помогите пожалуйста.
У меня есть файл со строками.

R5D3F4 = DENVER = Москва = 34 = + = информация пока отсутствует
E4F5R4 = SEDEK = Москва = 89 = + = информация пока отсутствует
DFT5H4 = nimbus = Москва = 47 = + = информация пока отсутствует


Содержимое и колличество строк может быть разное в 4 переменной цифры постоянно меняются.
Мне надо чтобы скрипт проходя уменьшал в 4 переменной цифры на 1 если в строке 4 переменная достигла 0 то удалял эту строку и делал вывод echo с 1 переменной той строки которую удалил.
Главное чтобы не нарушалось расстояние между строками не добавлялись лишние \r\n но если строка удалилась то и удалиться должны все \r\n которые принадлежат ей.
P.s. Извиняюсь за ошибки пишу с кпк.

   
 
 автор: cheops   (06.05.2005 в 12:30)   письмо автору
 
   для: посетитель   (06.05.2005 в 09:45)
 

Обычно, прибегают к регулряным выражениям, мы тут где-то с sedek-ом эту задачу решали, к соожалению ссылку на тему найти не могу. Приведу пример из книги "PHP 5 в примерах", которая выйдет в начале июня этого года.
Пусть имеется файл count.txt
first = 34
second = 56
third = 14
fourth = 48

тогда при каждом обращении к файлу скрипт будет уменьшать значение счётчиков и по достижении 0 удлять строку с нулевым значением
<?php
  
// Имя файла
  
$filename "count.txt";
  
// Получаем содержимое файла
  // в виде массива строк
  
$lines file($filename);
  
// В эту строку будем складывать
  // новые строки файла
  
$data "";
  
// Обработку данных производим
  // в цикле
  
foreach($lines as $index => $line)
  {
    
$patern "|^([^ ]+) = ([^\n]+)|i";
    
preg_match ($patern$line$out);
    
// Если число равно 0, то пропускаем
    // цикл, исключая тем самым строку из
    // конечной строки $data
    
$out[2]--;
    if(
$out[2] == 0) continue;
    
$data .= "$out[1] = $out[2]\n";
    echo 
"$out[1] = $out[2]<br>";
  }
  
// Записываем новые данные в файл
  
$fd fopen($filename"w");
  
fwrite($fd$data);
  
fclose($fd);
?>

   
 
 автор: посетитель   (08.05.2005 в 23:08)
 
   для: cheops   (06.05.2005 в 12:30)
 

я так понял что если переменная достигла 0 то она пропускается тем самым не попадает в $data и не записывается.
А как сделать чтобы когда достигнет 0 то не удалялась а вторая переменная заменялась допустим на off?

   
 
 автор: cheops   (09.05.2005 в 00:35)   письмо автору
 
   для: посетитель   (08.05.2005 в 23:08)
 

Можно поступить примерно следующим образом
<?php 
  
// Имя файла 
  
$filename "count.txt"
  
// Получаем содержимое файла 
  // в виде массива строк 
  
$lines file($filename); 
  
// В эту строку будем складывать 
  // новые строки файла 
  
$data ""
  
// Обработку данных производим 
  // в цикле 
  
foreach($lines as $index => $line
  { 
    
$patern "|^([^ ]+) = ([^\n]+)|i"
    
preg_match ($patern$line$out); 
    
// Если число равно 0, то пропускаем 
    // цикл, исключая тем самым строку из 
    // конечной строки $data 
    
if($out[2] != 'off'$out[2]--; 
    if(
$out[2] == 0$data .= "$out[1] = off\n"
    else 
$data .= "$out[1] = $out[2]\n"
  } 
  
// Записываем новые данные в файл 
  
$fd fopen($filename"w"); 
  
fwrite($fd$data); 
  
fclose($fd); 
?>

   
 
 автор: посетитель   (09.05.2005 в 03:30)
 
   для: cheops   (09.05.2005 в 00:35)
 

а так нельзя
<?php 
  
// Имя файла 
  $filename "count.txt"
  // Получаем содержимое файла 
  // в виде массива строк 
  $lines file($filename); 
  // В эту строку будем складывать 
  // новые строки файла 
  $data ""
  // Обработку данных производим 
  // в цикле 
  foreach($lines as $index => $line
  
    $patern "|^([^ ]+) = ([^\n]+)|i"
    preg_match ($patern$line$out); 
    // Если число равно 0, то пропускаем 
    // цикл, исключая тем самым строку из 
    // конечной строки $data 
    $out[2]--; 
    if($out[2] == 0$out[2]=str_replace($out[2],"off',$out[2]); 
    
$data .= "$out[1] = $out[2]\n"; 
  } 
  // Записываем новые данные в файл 
  
$fd = fopen($filename, "w"); 
  fwrite(
$fd$data); 
  fclose(
$fd); 
?>

   
 
 автор: посетитель   (09.05.2005 в 03:32)
 
   для: посетитель   (09.05.2005 в 03:30)
 

кавычку неправильную поставил.
с кпк пишу.

   
 
 автор: cheops   (09.05.2005 в 12:56)   письмо автору
 
   для: посетитель   (09.05.2005 в 03:30)
 

Можно, но необработанной конструкцию
$out[2]--;

оставлять нельзя, так как декремент к "off" приведёт к -1, нужно проверить не равно ли значение $out[2] == "off" и от этого принимать решение.

   
 
 автор: посетитель   (09.05.2005 в 13:05)
 
   для: cheops   (09.05.2005 в 12:56)
 

а разве если там будет off то он его всёравно будет продолжать вычитать? тамже не цифры будут.

   
 
 автор: cheops   (09.05.2005 в 13:22)   письмо автору
 
   для: посетитель   (09.05.2005 в 13:05)
 

Он приведёт его к цифре (к 0) и вычтет.

   
 
 автор: посетитель   (09.05.2005 в 09:41)
 
   для: cheops   (09.05.2005 в 00:35)
 

Что то не то.
почемуто добавляются пустые строки а именно добавляются разделитель = наверно после каждой строки добавляется.

   
 
 автор: посетитель   (09.05.2005 в 14:33)
 
   для: посетитель   (09.05.2005 в 09:41)
 

непойму где ошибка.
добавляются строки вида
= = = = =
= = = = =

   
 
 автор: cheops   (09.05.2005 в 18:09)   письмо автору
 
   для: посетитель   (09.05.2005 в 14:33)
 

Хм... а не могли бы вы привести код который у вас сейчас, тот что обрабатывает вашу последовательность из 5 =?

   
 
 автор: посетитель   (09.05.2005 в 19:18)
 
   для: cheops   (09.05.2005 в 18:09)
 

<?php
$lines 
file($fil);
$data "";
foreach(
$lines as $index => $line)
{
$patern "|^([^ ]+) = ([^ ]+) = ([^ ]+) = ([^ ]+) = ([^ ]+) = ([^\n]+)|i";
preg_match ($patern$line$out);
if(
$out[4] != 'off')
$out[4]--;
if(
$out[4] == 0){
$data .= "$out[1] = $out[2] = $out[3] = off = $out[5]-OFF = $out[6]\n";
echo 
'$PID'."\r\n$out[1] $time-$master> Ваш статус OFF.<ems:br>____<ems:br><encode>master xchat.chat online</encode>-Вернуться.\r\n"; }
else
$data .= "$out[1] = $out[2] = $out[3] = $out[4] = $out[5] = $out[6]\n";
}
$fd fopen($fil"w");
fwrite($fd$data);
fclose($fd);
?>
вот.

   
 
 автор: cheops   (09.05.2005 в 21:22)   письмо автору
 
   для: посетитель   (09.05.2005 в 19:18)
 

У вас по достижению 0 пишется вот эта абра-кадабра в файл
$PID
R5D3F4 -> Ваш статус OFF.<ems:br>____<ems:br><encode>master xchat.chat online</encode>-Вернуться.
R5D3F4 = DENVER = Москва = off = +-OFF = информация пока отсутствует 
E4F5R4 = SEDEK = Москва = 88 = + = информация пока отсутствует 
DFT5H4 = nimbus = Москва = 46 = + = информация пока отсутствуе

и скрипт не может её корректно обработать, так как он заточен под определённый формат.

PS Вы с ума свихнётесь на файлах :))) переходите на MySQL, не пожалеете :)))

   
 
 автор: посетитель   (09.05.2005 в 23:03)
 
   для: cheops   (09.05.2005 в 21:22)
 

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

   
 
 автор: посетитель   (09.05.2005 в 23:06)
 
   для: посетитель   (09.05.2005 в 23:03)
 

можно это както исправить?

   
 
 автор: cheops   (10.05.2005 в 13:07)   письмо автору
 
   для: посетитель   (09.05.2005 в 23:03)
 

Да действительно, просто выводил в окно браузера и просмотрел, что вывод не идёт в файл. Причина появления пустых строк с =, заключается в том, что со временем в конце накапливаются переводы строк (так как последняя строка тоже содержит \n, хотя не следовало бы), которые затем интерпретируются. Чтобы избавиться от этого, прогоняйте перед записью в файл, переменную $data через функцию trim().
<?php
  $data 
trim($data);
?>

   
 
 автор: посетитель   (10.05.2005 в 13:59)
 
   для: cheops   (10.05.2005 в 13:07)
 

спасибо я уж немного исправил.


<?php
$lines 
file($fil);
$data "";
foreach(
$lines as $index => $line)
{
$patern "|^([^ ]+) = ([^ ]+) = ([^ ]+) = ([^ ]+) = ([^ ]+) = ([^\n]+)|i";
preg_match ($patern$line$out);
$out[4]--;
if(
$out[4] == 0){
$data .= "$out[1] = $out[2] = $out[3] = $out[4] = $out[5]-off = $out[6]\n";
}
else
$data .= "$out[1] = $out[2] = $out[3] = $out[4] = $out[5] = $out[6]\n";
if(
$out[4] == 1){
echo 
'$PID'."\r\n$out[1] $time-$master> Ваш статус OFF.<ems:br>____<ems:br><encode>master xchat.chat online</encode>-Вернуться.\r\n"; }
}
$data trim($data);
$fd fopen($fil"w");
fwrite($fd$data);
fclose($fd);
?>

   
Rambler's Top100
вверх

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