【问题标题】:remove spaces from string - regex从字符串中删除空格 - 正则表达式
【发布时间】:2018-11-20 18:39:00
【问题描述】:

我有一个 csv 文件,其中包含由空格(千位分隔符)分隔的数字的字符串字段,例如“1 025 000”而不是“1025000”。

我想删除那些空格,仅适用于带有数字的字段,因此我可以使用 jolt 转换转换为 double 以在输出上获取 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})?")

提前致谢!

【问题讨论】:

  • 我不确定是否有一个正则表达式在这里是万无一失的。我的第一反应是,您应该回到 JSON 的源代码并更改数字的格式。你有什么理由不能这样做吗?
  • 在 apache-nifi 中我收到了我转换为 json 的文本,我无法在 json 步骤之前进行转换
  • 您根本不想在 JSON 上使用正则表达式,句号。解析 JSON,转换包含的数据(您可以使用正则表达式),将数据序列化回 JSON。其他所有方法都是错误的。 (除非您已经这样做了,否则请包括您目前所做的颠簸转换。)
  • 我没有解释清楚,我在输入中有一个 csv 文件,我想应用正则表达式来使用 nifi 的替换文本删除数字之间的空格。颠簸是为了转换为双倍,它应用于我在输出中得到的 json
  • 您能显示您的 CSV 文件的一部分吗?当我们不知道其他条目的样子时,很难仅匹配数字。

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


【解决方案1】:

虽然您可以通过 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)

ExecuteScriptsuccess 关系连接到您的用例要求的处理器。无论如何,所提供输入的输出将如下所示:

{
  "name" : "item1",
  "val" : "1345000"
}

{
  "name" : "item2",
  "val" : "2432"
}

【讨论】:

  • Sivaprasanna 的建议很好。我会更进一步并提供使用ConvertRecordCSVReaderScriptedRecordSetWriter,这将允许您将重新格式化的值写入CSV 或JSON 内联,因此您不需要拆分和生成额外的流文件。
  • 您的建议很好,但我也有一些我不想从中删除空格的字段。有没有办法只为数字调整正则表达式?
  • 如果您查看上面发布的 Groovy 代码,它只是从 val 字段中删除空格,而不是从所有字段中删除。如果您使用的字段很少,则可以使用这种方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-17
  • 2014-06-20
  • 1970-01-01
  • 1970-01-01
  • 2022-06-28
  • 2021-09-07
相关资源
最近更新 更多