Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
title/etc/hydra/hmed/collecting/parsers/parser.yml
parsers:
  plain:
    # спецификация парсера
    switch_2:
      cdr_delimiter: "\n" # разделитель между CDR в файле (символ новой строки)
      preprocessors:
		# предобработчики строки перед разбором
        - type: trim # обрезание краевых символов
          direction: left # край строки, возможные значения: left, right, both
          char: ' ' # символ
        - type: substring # взятие подстроки ('test' -> 'es')
          begin: 1 # начальная позиция (будет обрезан первый символ строки)
          end: -1 # конечная позиция (значение -1 означает, что подстрока будет взята до предпоследнего символа строки)
      records:
        - matcher:
			# регулярное выражение для разбора CDR на поля
            #        1      2             3     4           5                                     6     7
            #        trk_a  station_a     trk_b station_b   day    month year  hour minute second dur   status
            pattern: ^(\w+) (\d+|-)[^\s]* (\w+) (\d+)[^\s]* (\d{2}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) (\d+) (\d+)$
          fields:
            map:
              # соответствие полей CDR и строки, разобранной регулярным выражением
			  # первое поле $g1, второе $g2 и т.д.
			  # подстановка $g0 содержит всю строку
              trunk_a: $g1
              station_a: $g2
              trunk_b: $g3
              station_b: $g4
              call_datetime: $g5
              duration_sec: int($g6) # приведение к целому числу
              termination_code: $g7
        - matcher:
            min_length: 50 # для тех CDR, которые не удовлетворяют первому регулярному выражению и имеют длину >= 50 символов
          fields:
            delimiter: '\s+' # используем разделитель для получения полей (поддерживаются регулярные выражения)
            map:
              trunk_a: $f1 # первое поле в массиве строк после разбиения исходной строки
              station_a: $f2 # второе поле и т. д.
              trunk_b: $f3
              station_b: $f4
              call_datetime: $f5
              duration_sec: int($f6)
              termination_code: $f7
              entire_cdr: $f0 # в переменной $f хранится вся строка с CDR

Таким образом на выходе коллектора получатся разобранные CDR в формате JSON вида:

...