Json 从string-regex中删除空格
我有一个csv文件,其中的字符串字段包含由空格(千位分隔符)分隔的数字,例如“1025000”而不是“1025000” 我想删除那些空白,只针对带数字的字段,这样我就可以通过jolt转换将其转换为double,以便在输出时获得json文件,我正在使用regex表达式在ApacheNIFI和replaceText处理器上执行此操作 这是我的csv示例:Json 从string-regex中删除空格,json,regex,type-conversion,apache-nifi,jolt,Json,Regex,Type Conversion,Apache Nifi,Jolt,我有一个csv文件,其中的字符串字段包含由空格(千位分隔符)分隔的数字,例如“1025000”而不是“1025000” 我想删除那些空白,只针对带数字的字段,这样我就可以通过jolt转换将其转换为double,以便在输出时获得json文件,我正在使用regex表达式在ApacheNIFI和replaceText处理器上执行此操作 这是我的csv示例: Client1;Client2;Client3;price1;price2;price3 john smith;john2 smith2;john
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"
}
虽然您可以通过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"
}
我不确定这里是否有一个简单的正则表达式。我的第一直觉是,你应该回到JSON的源代码并更改数字的格式。有什么原因不能这样做吗?在apache nifi中,我收到了转换为JSON的文本,我不能在JSON步骤之前进行转换。你不想这样做在JSON上使用正则表达式,句号。解析JSON,转换包含的数据(您可以使用正则表达式),将数据序列化回JSON。其他任何方法都是错误的。(除非您已经这样做了,否则请包含到目前为止的jolt转换。)我没有解释清楚,我在输入中有一个csv文件,我想应用正则表达式,用nifi的replacetext删除数字之间的空格。震动用于转换为double,它应用于我在输出中得到的json。你能显示你的csv文件的一部分吗?当我们不知道另一个是什么时,很难只匹配数字条目看起来像。我不确定这里是否有一个简单易懂的正则表达式。我的第一反应是,您应该返回JSON的源代码并更改数字的格式。有什么原因不能这样做吗?在apache nifi中,我收到了转换为JSON的文本,我无法在JSON步骤之前进行转换你根本不想在JSON上使用正则表达式,句号。解析JSON,转换包含的数据(你可以使用正则表达式),将数据序列化回JSON。其他任何方法都是错误的。(除非你已经这样做了,否则请包括到目前为止的jolt转换。)我没有解释清楚,我在输入中有一个csv文件,我想应用正则表达式,用nifi的replacetext删除数字之间的空格。震动用于转换为double,它应用于我在输出中得到的json。你能显示你的csv文件的一部分吗?当我们不知道另一个是什么时,很难只匹配数字条目看起来像。Sivaprasanna的建议很好。我会更进一步,提供一个
CSVReader
和一个允许您以CSV或JSON内联方式写入重新格式化的值,因此您不需要拆分和生成额外的流文件。您的建议很好,但我也有一些字段,我不想删除这些字段来自的空格。是否有一种方法可以使正则表达式仅适用于数字?如果您查看上面发布的Groovy代码,它只是从val
字段中删除空格,而不是从所有字段中删除空格。如果您使用的字段非常少,您可以使用这种方法。Sivaprasanna的建议很好。我将更进一步nd提供了与CSVReader
和a一起使用的选项,这将允许您以CSV或JSON内联方式写出重新格式化的值,因此您不需要拆分和生成额外的流文件。您的建议很好,但我也有一些字段,我不想删除其中的空格。是否有办法仅针对num修改regex表达式bers?如果您查看上面发布的Groovy代码,它只是从val
字段中删除空格,而不是从所有字段中删除空格。如果您使用的字段很少,可以使用这种方法。