我正在使用Apache NiFi来构建我的数据流,而我目前处理的实际数据是由分隔值组成的。我想使用ExecuteScript,为了做到这一点,我已经整理了一个简单的Groovy脚本,应该执行以下操作:
1)用管道(|)
替换当前分隔符2)用“”
替换\ r \ n和\ tab此脚本的原因是对显示以下问题的数据集执行一些数据清理和争论:
a)文字(通常很长)通过Graphics
或new
跨行。这可以在完全停止之前发生,但它不一致。
b)空白行(目前脚本尚未触及)
1)很容易完成,但2)的代码似乎没有删除制表和回车,我不知道为什么。这是代码:
\tab
感谢您的帮助。
答案 0 :(得分:2)
当您使用eachLine
遍历这些行时,您已将所有\r
和\n
移除,因为eachLine
会对其进行拆分,然后依次为您提供结果。如果您要删除换行符,则无法使用eachLine
,或者您只需忽略\n
来电中的write()
。
至于' \ t'你确定那些确实是真的' \ t'字符?
除此之外,你不应该使用replaceAll()
你不要使用正则表达式。请改用replace()
。
答案 1 :(得分:0)
我最终得到了这个脚本,但它似乎删除了所有行末尾的所有LF
并将内容输出到一行。我想知道你是否能在代码中发现任何明显错误的东西。我希望仅在包含格式的行的末尾有一个\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)