从字符串中移除空格 - 正则表达式

时间:2018-06-11 13:32:38

标签: json regex type-conversion apache-nifi jolt

我有一个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})?")

提前致谢!

1 个答案:

答案 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"
}