Как преобразовать столбец в CSV-файл, используя Nifi? - PullRequest
0 голосов
/ 28 мая 2019

У меня есть необработанный CSV-файл, как показано ниже

   SVEIS , SVESID,SVETIME
   Quneter,53553,01122003010005
   renchure,37151,12092008011005

Теперь мне нужно изменить данные от дня месяц к году, дня месяца, как показано ниже

   SVEIS , SVESID,SVETIME
  Quneter,53553,2003-01-12 01:00:05
  renchure,37151,2008-12-09 01:10:05

Мне нужно изменитьэто с использованием NIFI

Я использовал заменить текстовый процессор, но я получаю сообщение об ошибке, как будто я не могу обработать 10 из 10 записей в nifi

Ответы [ 3 ]

0 голосов
/ 28 мая 2019

Если можно использовать awk, это можно решить следующим образом:

awk -F, '{
    f1=substr($3,1,2);
    f2=substr($3,3,2);
    f3=substr($3,5,2);
    f4=substr($3,7,2);
    f5=substr($3,9,2);
    f6=substr($3,11,2);
    f7=substr($3,13,2)}
    NR<2 {print $1,$2,$3;next}
    {print $1,$2,f3 f4"-"f1"-"f2,f5":"f6":"f7}' file

   SVEIS   SVESID SVETIME
   Quneter 53553 2003-01-12 01:00:05
   renchure 37151 2008-12-09 01:10:05
0 голосов
/ 28 мая 2019

Хотя оба существующих ответа объясняют, как выполнить эту задачу, используя разбор строк через регулярные выражения, эти решения будет довольно сложно изменить, если входящие данные изменятся каким-либо образом. Вопрос для Apache NiFi, и решение состоит в том, чтобы обрабатывать данные CSV как records и использовать процессор UpdateRecord. Этот процессор позволяет использовать синтаксис RecordPath для указания интересующего вас поля (столбца) и замены его новым значением, которое может быть статическим или определяться с помощью Язык выражений . Вы можете использовать методы #toDate и #format для преобразования строки из входящего формата в требуемый (или просто вставить разделители напрямую).

Есть хороших статей о , использующих также RecordPath механику .

0 голосов
/ 28 мая 2019

Мы можем начать с простого выражения, используя квантификаторы и группы захвата:

(.+,)([0-9]{2})([0-9]{2})([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})

и замените его на:

$1$4-$3-$2 $5:$6:$7

, где $1-$7 - наши группы с новым желаемым форматом.

DEMO

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

Демо

const regex = /(.+,)([0-9]{2})([0-9]{2})([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})/gm;
const str = `Quneter,53553,01122003010005
renchure,37151,12092008011005`;
const subst = `$1$4-$3-$2 $5:$6:$7`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log(result);
...