Регулярное выражение для удаления пустых строк - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь удалить пустые строки и недопустимые записи в одном регулярном выражении.Но, похоже, не работает.В приведенном ниже примере записи, которые содержат Serverserial: 0 и ServerName: "" empty являются недопустимыми записями,

{"eventType":"delete","ServerSerial":"1142691750","ServerName":"XYZ_P_O","deletedat":"2018-08-24 15:30:48.136"},
{"eventType":"delete","ServerSerial":"0","ServerName":"","deletedat":"2018-08-24 15:30:48.136"},
{"eventType":"delete","ServerSerial":"1142691950","ServerName":"ABC_P_1","deletedat":"2018-08-24 15:30:48.136"},
{"eventType":"delete","ServerSerial":"0","ServerName":"","deletedat":"2018-08-24 15:30:48.136"},
{"eventType":"delete","ServerSerial":"0","ServerName":"","deletedat":"2018-08-24 15:30:48.136"},
{"eventType":"delete","ServerSerial":"1142691750","ServerName":"COL_P_1","deletedat":"2018-08-24 15:30:48.136"}

При использовании приведенного ниже регулярного выражения удаляются только недействительные записи, но не удаляются следы (пустые строки)

.*(?<=ServerSerial":")0(?=").*|.*(?<=ServerName":")(?=").*

и попробовал это тоже, Не повезло

.*(?<=ServerSerial":")0(?=").*[\r\n]*|.*(?<=ServerName":")(?=").*[\r\n]*

Токовый выход похож на пустые строки

{"eventType":"delete","ServerSerial":"1142691750","ServerName":"XYZ_P_O","deletedat":"2018-08-24 15:30:48.136"},

{"eventType":"delete","ServerSerial":"1142691950","ServerName":"ABC_P_1","deletedat":"2018-08-24 15:30:48.136"},


{"eventType":"delete","ServerSerial":"1142691750","ServerName":"COL_P_1","deletedat":"2018-08-24 15:30:48.136"}

Но ожидаемый результат равен

{"eventType":"delete","ServerSerial":"1142691750","ServerName":"XYZ_P_O","deletedat":"2018-08-24 15:30:48.136"},
{"eventType":"delete","ServerSerial":"1142691950","ServerName":"ABC_P_1","deletedat":"2018-08-24 15:30:48.136"},
{"eventType":"delete","ServerSerial":"1142691750","ServerName":"COL_P_1","deletedat":"2018-08-24 15:30:48.136"}

Ответы [ 6 ]

0 голосов
/ 20 сентября 2018

Начиная с NiFi 1.7.0 (через NIFI-4456 ), вы можете настроить JsonTreeReader для чтения «один JSON на строку» в соответствии с вашим форматом. Затем вы можете использовать QueryRecord для выдачи SQL-запросадля маршрутизации записей, как вам нравится, например, «неверное» свойство с запросом SELECT * FROM FLOWFILE WHERE ServerSerial = 0 AND ServerName = "" и «допустимое» свойство с запросом SELECT * FROM FLOWFILE WHERE ServerSerial <> 0 OR ServerName <> "" или что-то в этом роде.

0 голосов
/ 20 сентября 2018

Если все ваши записи будут основаны на строках, это можно решить с помощью Perl.Используя однострочное решение perl, мы можем использовать hex \ x22 для двойных кавычек.Посмотрите, работает ли нижеприведенное для вас.Я добавил пустые строки в дополнение к вашему вводу.

>cat regex_event.dat
{"eventType":"delete","ServerSerial":"1142691750","ServerName":"XYZ_P_O","deletedat":"2018-08-24 15:30:48.136"},
{"eventType":"delete","ServerSerial":"0","ServerName":"","deletedat":"2018-08-24 15:30:48.136"},

{"eventType":"delete","ServerSerial":"1142691950","ServerName":"ABC_P_1","deletedat":"2018-08-24 15:30:48.136"},
{"eventType":"delete","ServerSerial":"0","ServerName":"","deletedat":"2018-08-24 15:30:48.136"},
{"eventType":"delete","ServerSerial":"0","ServerName":"","deletedat":"2018-08-24 15:30:48.136"},

{"eventType":"delete","ServerSerial":"1142691750","ServerName":"COL_P_1","deletedat":"2018-08-24 15:30:48.136"}
>
>perl -ne ' s/^\s*$//g; print if length($_) > 0 and not m/\x22ServerSerial\x22:\x220\x22,\x22ServerName\x22:\x22\x22/' regex_event.dat
{"eventType":"delete","ServerSerial":"1142691750","ServerName":"XYZ_P_O","deletedat":"2018-08-24 15:30:48.136"},
{"eventType":"delete","ServerSerial":"1142691950","ServerName":"ABC_P_1","deletedat":"2018-08-24 15:30:48.136"},
{"eventType":"delete","ServerSerial":"1142691750","ServerName":"COL_P_1","deletedat":"2018-08-24 15:30:48.136"}
>
0 голосов
/ 20 сентября 2018

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

Используя процессор ReplaceText.

Search:  \n\n\s|\n\s

Replace:  \n

http://regexr.com/3fbst

Ссылка: Какиспользовать регулярные выражения для удаления пробелов между двумя строками?

Дайте мне знать, если у вас возникнут какие-либо проблемы в этом.

0 голосов
/ 20 сентября 2018

Когда у вас есть (ваш файл преобразован в) файл Unix, вы можете использовать

grep -Ev 'ServerSerial":"0?"|ServerName":"0?"' inputfile
0 голосов
/ 19 сентября 2018

Добавьте это ко второму регулярному выражению:

(?<=[\r\n])[\r\n]|

, чтобы удалить пустые строки, удаляя символы новой строки, которым предшествует другая новая строка.

0 голосов
/ 19 сентября 2018

Метод 1: Использование 1 процессора ReplaceText:

Поскольку я использовал одно из ваших регулярных выражений, которое вы упомянули в вопросе.

Настройте процессор ReplaceText как

Поиск значения

(?<=ServerSerial":")0(?=").*[\r\n]*|.*(?<=ServerName":")(?=").*[\r\n]

Значение замены

${literal("")} //as we are not having any capture groups so i have used empty value for replacing.

enter image description here

Вход:

{"eventType":"delete","ServerSerial":"1142691750","ServerName":"XYZ_P_O","deletedat":"2018-08-24 15:30:48.136"},
{"eventType":"delete","ServerSerial":"0","ServerName":"","deletedat":"2018-08-24 15:30:48.136"},
{"eventType":"delete","ServerSerial":"1142691950","ServerName":"ABC_P_1","deletedat":"2018-08-24 15:30:48.136"},
{"eventType":"delete","ServerSerial":"0","ServerName":"","deletedat":"2018-08-24 15:30:48.136"},
{"eventType":"delete","ServerSerial":"0","ServerName":"","deletedat":"2018-08-24 15:30:48.136"},
{"eventType":"delete","ServerSerial":"1142691750","ServerName":"COL_P_1","deletedat":"2018-08-24 15:30:48.136"}

Выход:

{"eventType":"delete","ServerSerial":"1142691750","ServerName":"XYZ_P_O","deletedat":"2018-08-24 15:30:48.136"},
{"eventType":"delete","ServerSerial":"1142691950","ServerName":"ABC_P_1","deletedat":"2018-08-24 15:30:48.136"},
{"eventType":"delete","ServerSerial":"1142691750","ServerName":"COL_P_1","deletedat":"2018-08-24 15:30:48.136"}

Метод 2: Использование процессора QueryRecord:

Если вам известна схема данных, вы можете использовать процессор QueryRecord, а затем добавить новое свойство в QueryRecord процессор как

select * from FLOWFILE where ServerName is not null and ServerSerial > 0

Затем процессор выводит файл потока сзаписей, удовлетворяющих приведенному выше SQL-запросу.

Метод 3: Использование 2 процессоров ReplaceText в серии:

Использование ReplaceText процессорсо следующими конфигами:

Поиск значения

\n+\s+

Замена значения

shift+enter

Набор символов

UTF-8

Максимум BРазмер UFFER

1 MB //needs to change this values as per your flowfile size

Стратегия замены

Regex Replace

Режим оценки

Entire text

enter image description here

Я пыталсясо следующими данными в моем локальном экземпляре

содержимое входного потока:

{"eventType":"delete","ServerSerial":"1142691750","ServerName":"XYZ_P_O","deletedat":"2018-08-24 15:30:48.136"},

{"eventType":"delete","ServerSerial":"1142691950","ServerName":"ABC_P_1","deletedat":"2018-08-24 15:30:48.136"},


{"eventType":"delete","ServerSerial":"1142691750","ServerName":"COL_P_1","deletedat":"2018-08-24 15:30:48.136"}

содержимое выходного потока:

{"eventType":"delete","ServerSerial":"1142691750","ServerName":"XYZ_P_O","deletedat":"2018-08-24 15:30:48.136"},
{"eventType":"delete","ServerSerial":"1142691950","ServerName":"ABC_P_1","deletedat":"2018-08-24 15:30:48.136"},
{"eventType":"delete","ServerSerial":"1142691750","ServerName":"COL_P_1","deletedat":"2018-08-24 15:30:48.136"}

Обратитесь к этой ссылке для другого подхода к замене пустых строк в файле потока.

...