如何使用Nifi转换csv文件中的列?

时间:2019-05-28 04:12:25

标签: regex string apache apache-nifi regex-group

我有一个原始的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进行更改

我曾经使用过替换文本处理器,但出现错误,例如无法处理nifi中的10条记录中的10条

3 个答案:

答案 0 :(得分:0)

我们可以从使用量词和捕获组的简单表达式开始:

@Component({
  selector: 'a-comp',
  template: `<div></div>`
})
export class AComponent implements OnInit {
  constructor( private authService: AuthService ) {}
  ngOnInit() {
    console.log('HOY', this.authService.getUser());
  }
}

@Component({
  selector: 'b-comp',
  template: `<div></div>`
})
export class BComponent implements OnInit {
  constructor( private authService: AuthService ) {}
  ngOnInit() {
    console.log('HOY', this.authService.getUser());
  }
}

并替换为:

(.+,)([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 是我们具有新期望格式的组。

DEMO

RegEx电路

jex.im可视化正则表达式:

enter image description here

演示

$1-$7

答案 1 :(得分:0)

如果可以使用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

答案 2 :(得分:0)

尽管两个现有答案都说明了如何通过正则表达式使用String解析来完成此任务,但是如果传入数据以任何方式更改,则这些解决方案的更改将相当复杂。问题是针对Apache NiFi,解决方案是将CSV数据视为记录,并使用UpdateRecord处理器。该处理器允许您使用RecordPath语法来指定您感兴趣的字段(列),并用一个新值替换它,该值可以是静态的,也可以通过Expression Language确定。您可以使用#toDate#format方法将字符串从输入格式转换为所需的格式(或直接插入分隔符)。

关于good articles也有using the RecordPath mechanics