|
автор: посетитель (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. Извиняюсь за ошибки пишу с кпк. | |
|
|
|
|
|
|
|
для: посетитель
(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? | |
|
|
|
|
|
|
|
для: посетитель
(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)
| | кавычку неправильную поставил.
с кпк пишу. | |
|
|
|
|
|
|
|
для: посетитель
(09.05.2005 в 03:30)
| | Можно, но необработанной конструкцию
оставлять нельзя, так как декремент к "off" приведёт к -1, нужно проверить не равно ли значение $out[2] == "off" и от этого принимать решение. | |
|
|
|
|
автор: посетитель (09.05.2005 в 13:05) |
|
|
для: cheops
(09.05.2005 в 12:56)
| | а разве если там будет off то он его всёравно будет продолжать вычитать? тамже не цифры будут. | |
|
|
|
|
|
|
|
для: посетитель
(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)
| | непойму где ошибка.
добавляются строки вида
= = = = =
= = = = = | |
|
|
|
|
|
|
|
для: посетитель
(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);
?>
| вот. | |
|
|
|
|
|
|
|
для: посетитель
(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)
| | можно это както исправить? | |
|
|
|
|
|
|
|
для: посетитель
(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);
?>
|
| |
|
|
|