1

私は Apache NiFi を使用してデータフローを構築していますが、現在扱っている実際のデータは区切り値で構成されています。私は ExecuteScript を使用したいと考えています。そのために、次のことを行う単純な Groovy スクリプトを作成しました。

1) 現在の区切り文字をパイプ (|) に置き換えます

2) \r\n と \tab を " " に置き換えます。

このスクリプトの理由は、次の問題を示すデータセットでデータのクリーニングとラングリングを行うことです。

\taba) テキスト (多くの場合長い) は、またはを介し​​て行をまたいでい\r\nます。これは完全な停止の前に発生する可能性がありますが、一貫していません。

b) 空白行 (現在、スクリプトはまだこれに触れていません)

1) は簡単に実行できましたが、2) のコードでは表とキャリッジ リターンが削除されていないようで、その理由がわかりません。コードは次のとおりです。

import org.apache.nifi.processor.io.StreamCallback

import java.nio.charset.StandardCharsets

def flowFile = session.get()
if(!flowFile) return

flowFile = session.write(flowFile, {inputStream, outputStream ->
    inputStream.eachLine { line ->
        def a = line.replaceAll('\t', ' ').replaceAll('\r\n', ' ').replaceAll('¦', '|')
        outputStream.write("${a}\n".toString().getBytes(StandardCharsets.UTF_8))
    }
} as StreamCallback)

session.transfer(flowFile, REL_SUCCESS)

ご協力ありがとうございました。

4

2 に答える 2

2

線をたどると、eachLineすでにすべてが削除されて\rおり、それら\nの分割としてeachLine、結果が順番に表示されます。改行文字を削除したい場合は、使用できないeachLineか、単に呼び出し\nから除外できwrite()ます。

「\t」については、本当に「\t」文字であると確信していますか?

それに加えて、replaceAll()正規表現を使用しないでください。replace()代わりに使用してください。

于 2016-05-10T21:40:06.900 に答える
0

私はこのスクリプトに行き着きましLFたが、すべての行の最後にあるすべてを削除し、コンテンツを 1 行に出力するようです。コード内で明らかに間違っている点を見つけられるかどうか疑問に思います。\n形式を保持している行の最後にのみがあることを期待しています:|digit

import org.apache.nifi.processor.io.StreamCallback
import java.nio.charset.StandardCharsets

def flowFile = session.get()
if (!flowFile) return

flowFile = session.write(flowFile, { inputStream, outputStream ->
    inputStream.eachLine { line ->
        def a = line.replace('\t', ' ').replace('¦', '|')
        if (${a}.endWith('\\d$'))
            outputStream.write("${a}\n".toString().getBytes(StandardCharsets.UTF_8))
        else {
            outputStream.write("${a}".toString().getBytes(StandardCharsets.UTF_8))
        }
    }

} as StreamCallback)

session.transfer(flowFile, REL_SUCCESS)
于 2016-05-14T23:44:26.667 に答える