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
Форумы портала PHP.SU :: Версия для печати :: Проверка строк .txt на условие
Форумы портала PHP.SU » PHP » Напишите за меня, пожалуйста » Проверка строк .txt на условие

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

1. rus181818 - 05 Августа, 2014 - 15:38:45 - перейти к сообщению
Дано:

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

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


Нужно:

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

буду очень благодарен, если поможете с решением данной задачи Подмигивание
2. Panoptik - 05 Августа, 2014 - 16:00:36 - перейти к сообщению
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.         }
3. rus181818 - 09 Сентября, 2014 - 20:03:47 - перейти к сообщению
Спасибо за помощь! Но что то не получается: в результате выполнения скрипта ничего не выводится(


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.         }
4. dcc0 - 09 Сентября, 2014 - 22:54:58 - перейти к сообщению
Можно сделать два файла. Файл1 - в нем лежит единственная строка, планировщик читает. Строка выводится, запоминается.
Далее открывается второй файл - Файл2, читается построчно, сравнивается со строкой в памяти.
Если строки совпадают, следующая строка из Файла2 записывается в Файл1 - перезапись.

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

Сейчас же не 12 августа. Не понял
5. rus181818 - 10 Сентября, 2014 - 16:45:19 - перейти к сообщению
Идея хороша, но мне нужен не алгоритм, а его результат - рабочий php код.
Я в курсе, что не 12августа Подмигивание Подставлял 090914 (вчера), php код ничего не выводит

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

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

Сейчас же не 12 августа. Не понял
6. Tyoma5891 - 10 Сентября, 2014 - 17:37:20 - перейти к сообщению
rus181818 пишет:
Идея хороша, но мне нужен не алгоритм, а его результат - рабочий php код.

Вам в платный раздел Улыбка
7. rus181818 - 10 Сентября, 2014 - 20:01:37 - перейти к сообщению
Tyoma5891 пишет:
rus181818 пишет:
Идея хороша, но мне нужен не алгоритм, а его результат - рабочий php код.

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

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

Файл 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.  

Под изменением условия понимается, что к дате прибавляются часы.
Раз уж у вас на дату несколько сообщений. В итоге вы получите то же самое.
9. rus181818 - 10 Сентября, 2014 - 22:24:52 - перейти к сообщению
Нет, к сожалению, условие изменить нельзя( я конечно могу >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. dcc0 - 10 Сентября, 2014 - 23:01:04 - перейти к сообщению
Не хотите просто, сделаем сложно.
Два файла. Оба на чтение, иной еще и на запись, сравниваем дату, сравниваем значение, полученное после разбиения. Выводим, пишем в файл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 вцйв цййц лруйлцо рйцоурлйцу
11. rus181818 - 11 Сентября, 2014 - 07:07:24 - перейти к сообщению
СПАСИБО! Вроде все работает. Можно только капельку доработать скрипт? Чтобы он выводил не "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 вцйв цййц лруйлцо рйцоурлйцу
12. dcc0 - 11 Сентября, 2014 - 07:34:11 - перейти к сообщению
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. ?>
13. rus181818 - 11 Сентября, 2014 - 18:02:37 - перейти к сообщению
Всё работает, всё работает как надоУлыбка Спасибо! Скинь телефон в ПМ.
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. ?>

 

Powered by ExBB FM 1.0 RC1