...
Code Block | ||
---|---|---|
| ||
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: delimeterdelimiter: '\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 |
...