>我有一个csv文件,其中包含字符串字段,其中包含由空格(千的分隔符(分隔的数字,例如"1 025 000"而不是"1025000"。
我想删除这些空格,仅适用于带有数字的字段,这样我就可以使用 jolt 转换转换为双倍以在输出时获得 json 文件,我正在使用正则表达式在带有 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})?")
提前感谢!
虽然您可以通过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)
根据您的用例要求,将ExecuteScript
的success
关系连接到处理器。无论如何,所提供输入的输出将如下所示:
{
"name" : "item1",
"val" : "1345000"
}
{
"name" : "item2",
"val" : "2432"
}