Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2020
549
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.19 KB | None | 0 0
  1. # events.txt
  2. '''
  3. [2018-05-17 01:55:52.665804] NOK
  4. [2018-05-17 01:55:53.765804] NOK
  5. [2018-05-17 01:55:52.865804] NOK
  6. [2018-r:23.665804] OK
  7. [2018-05-17 01:56:55.665804] OK
  8. [2018-05-17 01:57:16.665804] NOK
  9. [2018-05-17 01:57:58.665804] OK
  10. [2018-05-17 01:58:52.665804] NOK
  11. [2018-05-17 01:58:53.665504] NOK
  12. [2018-05-17 01:58:54.65804] NOK
  13. [2018-05-17 01:58:55.665804] NOK
  14. [2018-05-17 01:58:55.622804] NOK
  15. [2018-r:55.6656604] NOK
  16. [2018-05-17 01:59:23.665804] OK
  17. [2018-05-17 01:59:55.665804] OK
  18. [2018-05-17 02:00:16.665804] NOK
  19. [2018-05-17 02:00:58.665804] OK
  20. [2018-05-17 02:01:52.665804] NOK
  21. [2018-05-17 02:02:23.665804] OK
  22. [2018-05-17 02:02:55.665804] OK
  23. [2018-05-17 02:03:16.665804] NOK
  24. [2018-05-17 02:04:58.665804] OK
  25. '''
  26.  
  27.  
  28. from datetime import datetime
  29.  
  30.  
  31. class Parser():
  32.  
  33.     # инициализация
  34.     def __init__(self, input_file, output_file, mode=1):
  35.         self.input = input_file
  36.         self.output = output_file
  37.         self.mode = mode
  38.  
  39.         # режимы работы
  40.         modes = {
  41.             0: ('second', '%Y-%m-%d %H:%M:%S'),
  42.             1: ('minute', '%Y-%m-%d %H:%M'),
  43.             2: ('hour', '%Y-%m-%d %H'),
  44.             3: ('day', '%Y-%m-%d'),
  45.             4: ('month', '%Y-%m'),
  46.             5: ('year', '%Y')
  47.         }
  48.  
  49.         self.limit = modes[mode][0]
  50.         self.time_format = modes[mode][1]
  51.  
  52.     # чтение входного файла
  53.     def parse(self):
  54.         with open(self.input, 'r', encoding='utf-8') as f:
  55.             yield from f
  56.  
  57.     # запись в файл (в режиме дополнения)
  58.     def write(self, s):
  59.         with open(self.output, 'a', encoding='utf-8') as f:
  60.             f.write(s)
  61.  
  62.     # фильтр строк содержащих 'NOK'
  63.     def filter(self, s):
  64.         if 'NOK' in s:
  65.             return s
  66.  
  67.     # функция получающая дату из строки
  68.     def get_date(self, s):
  69.         try:
  70.             date = datetime.strptime(s[1:s.index('.')], '%Y-%m-%d %H:%M:%S')
  71.         except AttributeError:
  72.             return None
  73.         except ValueError:
  74.             return None
  75.  
  76.         return date
  77.  
  78.     # старт парсера
  79.     def start(self):
  80.  
  81.         # генератор строк из входного файла
  82.         g = self.parse()
  83.  
  84.         # счетчик
  85.         count = 1
  86.         # предыдущая строка
  87.         prev = None
  88.  
  89.         # цикл
  90.         while True:
  91.             # получает строку от генератора
  92.             try:
  93.                 i = next(g)
  94.             # если строк больше нет
  95.             # записывает данные из последней строки в выходной файл
  96.             except StopIteration:
  97.                 if self.get_date(prev):
  98.                     self.write(self.get_date(prev).strftime(self.time_format) + ' NOK ' + str(count) + '\n')
  99.                 break
  100.  
  101.             # фильтрует строки по наличию 'NOK'
  102.             if self.filter(i):
  103.  
  104.                 # если найдена первая строка с нормальной датой
  105.                 # записывает ее как предыдущую и продолжает цикл
  106.                 if prev is None:
  107.                     if self.get_date(i):
  108.                         prev = i
  109.  
  110.                 # если предыдущая строка есть
  111.                 else:
  112.                     # проверяет дату текущей строки
  113.                     if self.get_date(i):
  114.                         # сравнивает даты текущей и предыдущей
  115.                         # если равны увеличивает счетчик
  116.                         # назначает текущую строку предыдущей
  117.                         if getattr(self.get_date(i), self.limit) == getattr(self.get_date(prev), self.limit):
  118.                             count += 1
  119.                             prev = i
  120.                         # если не равны
  121.                         # записывает данные предыдущей строки в файл
  122.                         # делает счетчик равным 1
  123.                         # назначает текущую строку предыдущей
  124.                         else:
  125.                             self.write(self.get_date(prev).strftime(self.time_format) + ' NOK ' + str(count) + '\n')
  126.                             count = 1
  127.                             prev = i
  128.        
  129.  
  130. # запуск в режиме по умолчанию
  131. parser = Parser('events.txt', 'output.txt')
  132. parser.start()
  133.  
  134. # запуск в выбранном режиме (0 - секунды, 1 - минуты, 2 - часы, 3 - дни, 4 - месяцы, 5 - годы)
  135. # parser = Parser('events.txt', 'output.txt', 2)
  136. # parser.start()
  137.  
  138. # output.txt
  139. '''
  140. 2018-05-17 01:55:52 NOK 1
  141. 2018-05-17 01:55:53 NOK 1
  142. 2018-05-17 01:55:52 NOK 1
  143. 2018-05-17 01:57:16 NOK 1
  144. 2018-05-17 01:58:52 NOK 1
  145. 2018-05-17 01:58:53 NOK 1
  146. 2018-05-17 01:58:54 NOK 1
  147. 2018-05-17 01:58:55 NOK 2
  148. 2018-05-17 02:00:16 NOK 1
  149. 2018-05-17 02:01:52 NOK 1
  150. 2018-05-17 02:03:16 NOK 1
  151. '''
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement