Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Проверка строк .txt на условие

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Проверка строк .txt на условие и вывод строки при его выполнении
rus181818
Отправлено: 05 Августа, 2014 - 15:38:45
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Дано:

txt файл с данными формата:

120814 раздватричетырепять один раз
130814 вышел зайчик погулять
130814 вышел зайчик погулять2
130814 вышел зайчик погулять3
150814 вдруг охотник выбегает


Нужно:

чтобы скрипт, запускающийся через cron каждый час проверял строки txt файла на условие совпадение текущей даты с датой, указанной в начале строки (120814 - т.е. 12 августа 2014), и при совпадении условия - выводил сообщение, находящееся в строке с соответствующей датой (раздватричетырепять один раз).
Также нужно учесть, что на одну дату может приходится несколько разных сообщений, и скрипт должен пропускать уже опубликованные строки. Т.е. в первый час 13 августа 2014 он опубликовал вышел зайчик погулять, через час - вышел зайчик погулять2 и т.д.

буду очень благодарен, если поможете с решением данной задачи Подмигивание
 
 Top
Panoptik
Отправлено: 05 Августа, 2014 - 16:00:36
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




PHP:
скопировать код в буфер обмена
  1. $lines = file('filename');
  2.         $todayDate = date('dmy');
  3.         $todayLines = array();
  4.         foreach($lines as $line) {
  5.             $text = preg_replace('!^' . $todayDate . ' !', '', $line, 1, $count);
  6.             if($count) {
  7.                 $todayLines[] = $text;
  8.             }
  9.         }
  10.         if(isset($todayLines[date('G')])) {
  11.             // do anything with text
  12.             echo $todayLines[date('G')];
  13.         }


-----
Just do it
 
 Top
rus181818
Отправлено: 09 Сентября, 2014 - 20:03:47
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Спасибо за помощь! Но что то не получается: в результате выполнения скрипта ничего не выводится(


Panoptik пишет:
PHP:
скопировать код в буфер обмена
  1. $lines = file('filename');
  2.         $todayDate = date('dmy');
  3.         $todayLines = array();
  4.         foreach($lines as $line) {
  5.             $text = preg_replace('!^' . $todayDate . ' !', '', $line, 1, $count);
  6.             if($count) {
  7.                 $todayLines[] = $text;
  8.             }
  9.         }
  10.         if(isset($todayLines[date('G')])) {
  11.             // do anything with text
  12.             echo $todayLines[date('G')];
  13.         }
 
 Top
dcc0
Отправлено: 09 Сентября, 2014 - 22:54:58
Post Id


Участник


Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014  


Помог: 10 раз(а)




Можно сделать два файла. Файл1 - в нем лежит единственная строка, планировщик читает. Строка выводится, запоминается.
Далее открывается второй файл - Файл2, читается построчно, сравнивается со строкой в памяти.
Если строки совпадают, следующая строка из Файла2 записывается в Файл1 - перезапись.

Цитата:
Спасибо за помощь! Но что то не получается: в результате выполнения скрипта ничего не выводится(

Сейчас же не 12 августа. Не понял

(Отредактировано автором: 09 Сентября, 2014 - 22:56:36)



-----
Март 2021. Бросил программирование
 
 Top
rus181818
Отправлено: 10 Сентября, 2014 - 16:45:19
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Идея хороша, но мне нужен не алгоритм, а его результат - рабочий php код.
Я в курсе, что не 12августа Подмигивание Подставлял 090914 (вчера), php код ничего не выводит

dcc0 пишет:
Можно сделать два файла. Файл1 - в нем лежит единственная строка, планировщик читает. Строка выводится, запоминается.
Далее открывается второй файл - Файл2, читается построчно, сравнивается со строкой в памяти.
Если строки совпадают, следующая строка из Файла2 записывается в Файл1 - перезапись.

Цитата:
Спасибо за помощь! Но что то не получается: в результате выполнения скрипта ничего не выводится(

Сейчас же не 12 августа. Не понял
 
 Top
Tyoma5891
Отправлено: 10 Сентября, 2014 - 17:37:20
Post Id


Частый посетитель


Покинул форум
Сообщений всего: 621
Дата рег-ции: Авг. 2013  


Помог: 5 раз(а)




rus181818 пишет:
Идея хороша, но мне нужен не алгоритм, а его результат - рабочий php код.

Вам в платный раздел Улыбка
 
 Top
rus181818
Отправлено: 10 Сентября, 2014 - 20:01:37
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Tyoma5891 пишет:
rus181818 пишет:
Идея хороша, но мне нужен не алгоритм, а его результат - рабочий php код.

Вам в платный раздел Улыбка

Вы напишите сюда - я заплачу, если все будет работать так как надо. Другой вопрос - во сколько вы оцениваете стоимость 15 строчек php кода)
 
 Top
dcc0
Отправлено: 10 Сентября, 2014 - 22:12:15
Post Id


Участник


Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014  


Помог: 10 раз(а)




Если бы можно было изменить условие, то проблема решается так:

Файл f1.txt:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. 1009201407 Вышел зайка погулять
  3. 1009201408 И опять, опять..
  4. 1009201409 Снова вышел
  5. 1009201410 Он...
  6.  


Скрипт:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.      $handle = fopen("f1.txt", "r");
  4.          while (!feof($handle)) {
  5.       $buffer = fgets($handle);  
  6.  
  7. $var= split(" ", $buffer);
  8.  
  9.          if($var['0']===date('dmYH')) {
  10.  
  11.      echo $buffer;     
  12. break;   
  13.  }      
  14. }
  15.   fclose($handle);
  16.  
  17. ?>
  18.  

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

(Отредактировано автором: 10 Сентября, 2014 - 22:19:14)



-----
Март 2021. Бросил программирование
 
 Top
rus181818
Отправлено: 10 Сентября, 2014 - 22:24:52
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Нет, к сожалению, условие изменить нельзя( я конечно могу >3000 строк проверить на совпадение дат и вручную рандомно поставить часики но... если все просто- не интересно)
+ опять же если настроить cron на выполнение раз в минуту хостер это не оценит))

dcc0 пишет:
Если бы можно было изменить условие, то проблема решается так:

Файл f1.txt:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. 1009201407 Вышел зайка погулять
  3. 1009201408 И опять, опять..
  4. 1009201409 Снова вышел
  5. 1009201410 Он...
  6.  


Скрипт:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.      $handle = fopen("f1.txt", "r");
  4.          while (!feof($handle)) {
  5.       $buffer = fgets($handle);  
  6.  
  7. $var= split(" ", $buffer);
  8.  
  9.          if($var['0']===date('dmYH')) {
  10.  
  11.      echo $buffer;     
  12. break;   
  13.  }      
  14. }
  15.   fclose($handle);
  16.  
  17. ?>
  18.  

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

(Отредактировано автором: 10 Сентября, 2014 - 22:28:06)

 
 Top
dcc0
Отправлено: 10 Сентября, 2014 - 23:01:04
Post Id


Участник


Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014  


Помог: 10 раз(а)




Не хотите просто, сделаем сложно.
Два файла. Оба на чтение, иной еще и на запись, сравниваем дату, сравниваем значение, полученное после разбиения. Выводим, пишем в файл2, чтобы сравнить при следующем вызове. В какой-то момент файл 2, если надо, можете обнулить (удалить).
Подразумевается, что f2.txt изначально пустой, а f1.txt лежат сообщения:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $handle2 = fopen("f2.txt", "r+");
  4.      $handle = fopen("f1.txt", "r");
  5.          
  6.          while (!feof($handle)) {
  7.       $buffer = fgets($handle);  
  8.       $buffer2 = fgets($handle2);      
  9.  
  10. $var= split(" ", $buffer, 2);
  11. $var1= split(" ", $buffer2, 2);
  12.  
  13.  
  14.          if($var['0']===date('dmy') && $var['1']!==$var1['1']) {
  15. fwrite($handle2, $buffer);
  16.      echo $buffer;     
  17.  
  18.          break;
  19.  }      
  20. }
  21.   fclose($handle);
  22.  fclose($handle2);
  23. ?>
  24.        
  25.  

P.S. У меня скрипт работает корректно. И вроде бы соответствует условию. Если все ок, можете кинуть мне денег на телефон Улыбка
Все-таки такие вещи лучше решать с bash.

Протестировано на этом файле:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. 110914 раздватричетырепять один раз
  3. 110914 вы1шел зайчик погулять
  4. 110914 в2ывшел зайчик погулять2
  5. 110914 вышв4ел зайчик погулять3
  6. 110914 вцйв цййц лруйлцо рйцоурлйцу

(Отредактировано автором: 10 Сентября, 2014 - 23:51:54)



-----
Март 2021. Бросил программирование
 
 Top
rus181818
Отправлено: 11 Сентября, 2014 - 07:07:24
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




СПАСИБО! Вроде все работает. Можно только капельку доработать скрипт? Чтобы он выводил не "110914 Текст сообщения", а просто "Текст сообщения".

dcc0 пишет:
Не хотите просто, сделаем сложно.
Два файла. Оба на чтение, иной еще и на запись, сравниваем дату, сравниваем значение, полученное после разбиения. Выводим, пишем в файл2, чтобы сравнить при следующем вызове. В какой-то момент файл 2, если надо, можете обнулить (удалить).
Подразумевается, что f2.txt изначально пустой, а f1.txt лежат сообщения:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $handle2 = fopen("f2.txt", "r+");
  4.      $handle = fopen("f1.txt", "r");
  5.          
  6.          while (!feof($handle)) {
  7.       $buffer = fgets($handle);  
  8.       $buffer2 = fgets($handle2);      
  9.  
  10. $var= split(" ", $buffer, 2);
  11. $var1= split(" ", $buffer2, 2);
  12.  
  13.  
  14.          if($var['0']===date('dmy') && $var['1']!==$var1['1']) {
  15. fwrite($handle2, $buffer);
  16.      echo $buffer;     
  17.  
  18.          break;
  19.  }      
  20. }
  21.   fclose($handle);
  22.  fclose($handle2);
  23. ?>
  24.        
  25.  

P.S. У меня скрипт работает корректно. И вроде бы соответствует условию. Если все ок, можете кинуть мне денег на телефон Улыбка
Все-таки такие вещи лучше решать с bash.

Протестировано на этом файле:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. 110914 раздватричетырепять один раз
  3. 110914 вы1шел зайчик погулять
  4. 110914 в2ывшел зайчик погулять2
  5. 110914 вышв4ел зайчик погулять3
  6. 110914 вцйв цййц лруйлцо рйцоурлйцу
 
 Top
dcc0
Отправлено: 11 Сентября, 2014 - 07:34:11
Post Id


Участник


Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014  


Помог: 10 раз(а)




PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $handle2 = fopen("f2.txt", "r+");
  3.      $handle = fopen("f1.txt", "r");
  4.          
  5.          while (!feof($handle)) {
  6.       $buffer = fgets($handle);  
  7.        $buffer2 = fgets($handle2);     
  8.  
  9. $var= split(" ", $buffer, 2);
  10. $var1= split(" ", $buffer2, 2);
  11.  
  12.          if($var['0']===date('dmy') && $var['1']!==$var1['1']) {
  13. fwrite($handle2, "$buffer");
  14.      echo $var['1'];   
  15.  
  16.          break;
  17.  }      
  18. }
  19.    fclose($handle);
  20.  fclose($handle2);
  21. ?>


-----
Март 2021. Бросил программирование
 
 Top
rus181818
Отправлено: 11 Сентября, 2014 - 18:02:37
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Всё работает, всё работает как надоУлыбка Спасибо! Скинь телефон в ПМ.
dcc0 пишет:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $handle2 = fopen("f2.txt", "r+");
  3.      $handle = fopen("f1.txt", "r");
  4.          
  5.          while (!feof($handle)) {
  6.       $buffer = fgets($handle);  
  7.        $buffer2 = fgets($handle2);     
  8.  
  9. $var= split(" ", $buffer, 2);
  10. $var1= split(" ", $buffer2, 2);
  11.  
  12.          if($var['0']===date('dmy') && $var['1']!==$var1['1']) {
  13. fwrite($handle2, "$buffer");
  14.      echo $var['1'];   
  15.  
  16.          break;
  17.  }      
  18. }
  19.    fclose($handle);
  20.  fclose($handle2);
  21. ?>
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB