удалить пробелы из строки - регулярное выражение - PullRequest
0 голосов
/ 11 июня 2018

У меня есть CSV-файл со строковыми полями, содержащими цифры, разделенные пробелами (разделитель тысяч), например «1 025 000» вместо «1025000».

Я хочу удалить эти пробелы, только для полей с цифрами, чтобы я мог выполнить преобразование в удвоение с помощью преобразования jolt, чтобы получить файл json на выходе, я делаю это на apache nifi с процессором replaceText, используявыражение regex.

это пример моего 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 голосов
/ 11 июня 2018

Хотя вы можете сделать это через 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)

Соединение отношения successExecuteScript для процессора, как того требует ваш вариант использования.В любом случае, вывод для предоставленного ввода будет выглядеть так:

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

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