【问题标题】:CSV parsing with groovy script using apache-nifi使用 apache-nifi 使用 groovy 脚本解析 CSV
【发布时间】:2019-12-24 17:34:30
【问题描述】:

我有一个包含 70 多列和数百万条记录的 csv 文件。但是对于处理,我需要大约 20 列。为了提取它们,我在Split fields and NiFi API with Groovy 中使用了修改后的groovy 脚本。

我的脚本:

import java.nio.charset.StandardCharsets

def flowFile = session.get()
if(!flowFile) return

flowFile = session.write(flowFile, {inputStream, outputStream ->
   inputStream.eachLine { line ->
   a = line.tokenize(',')
   outputStream.write("${a[0]},${a[1]},${a[2]},${a[3]},${a[4]}\n".toString().getBytes(StandardCharsets.UTF_8))
   }
} as StreamCallback)

session.transfer(flowFile, REL_SUCCESS)

原始 csv:

date,id,name,age,addr,lang
19/12/2019,1,sachith,29,sac@email,go
,2,nalaka,29,nalaka@email,
,,muhandiram,,c

ExecuteScript 处理器正在处理此内容时,输出如下所示:

date,id,name,age
19/12/2019,1,sachith,29
2,2,nalaka,29
null,null,muhandiram,null

如果数据字段为空,则替换为id,其他空值替换为null

为什么脚本行为不端? 我对groovy 的了解几乎一无所有。

预期输出:

date,id,name,age
19/12/2019,1,sachith,29
,2,nalaka,29
,,muhandiram,

【问题讨论】:

    标签: csv parsing groovy apache-nifi


    【解决方案1】:

    其实你的代码没问题,除了tokenize

    tokenize 方法不返回空标记。

    使用split 而不是tokenize 将所有值置于分隔符之间。

    例如以下代码:

    println ",,2,3,,".tokenize(',')
    println ",,2,3,,".split(',')
    println ",,2,3,,".split(',',-1)
    

    打印:

    [2, 3]
    [, , 2, 3]
    [, , 2, 3, , ]
    

    注意,没有-1split 会修剪最后一个空标记...

    所以,您的代码位已修改:

    def flowFile = session.get()
    if(!flowFile) return
    
    flowFile = session.write(flowFile, {inputStream, outputStream ->
        outputStream.withWriter("UTF-8"){ w ->
            inputStream.eachLine("UTF-8"){ line ->
                def row = line.split(',',-1)
                w << row[0..4].join(',') << '\n'
            }
        }
    } as StreamCallback)
    
    session.transfer(flowFile, REL_SUCCESS)
    

    编辑: 对于需要采取各种随机列的人。必须修改:

    w &lt;&lt; row[col0,col3,col5,col10,col21].join(',')

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多