我有一个csv文件,其中的字符串字段包含由空格分隔的数字(千位分隔符),示例" 1 025 000"而不是" 1025000"。
我想删除那些空格,仅用于带有数字的字段,这样我就可以通过jolt变换进行转换以获得输出上的json文件,我在使用regex的replaceText处理器的apache nifi上执行此操作表达
这是我的csv的一个例子:
Client1;Client2;Client3;price1;price2;price3
john smith;john2 smith2;john3 smith3;1 145;125;129 009
我使用的这个表达不起作用:(\s?=(\d{3},?)+(?:\.\d{1,3})?")
提前致谢!
答案 0 :(得分:4)
虽然你可以通过NiFi做到这一点,但我建议你尝试更改源码,并可能更正数字的格式和书写方式。
无论如何,我想到的一种方法是利用ExecuteScript
处理器来处理空白部分。
假设你有这样的CSV:
name,val
item1, 1 345 000
item2, 2 432
您可以使用SplitRecord
处理器将CSV转换为JSON并将其拆分为1条记录。将其输出提供给ExecuteScript
。
您可以使用以下Groovy
代码来读取流文件内容并替换所有空格
import org.apache.commons.io.IOUtils
import java.nio.charset.StandardCharsets
import groovy.json.JsonSlurper
flowFile = session.get()
if(!flowFile)return
def jsonSlurper = new JsonSlurper()
def text = ''
flowFile = session.write(flowFile, {inputStream, outputStream ->
input = IOUtils.toString(inputStream, StandardCharsets.UTF_8)
inputJson = jsonSlurper.parseText(input)
inputJson.val = inputJson.val.replaceAll("\\s", "")
outputStream.write(inputJson.toString().getBytes(StandardCharsets.UTF_8))
} as StreamCallback)
session.transfer(flowFile, REL_SUCCESS)
根据您的用例要求,将success
ExecuteScript
关系连接到处理器。无论如何,提供的输入的输出将如下所示:
{
"name" : "item1",
"val" : "1345000"
}
{
"name" : "item2",
"val" : "2432"
}