Groovy脚本用\“\”替换\ r \ n,\ n和\ t

时间:2016-05-10 20:16:36

标签: regex groovy apache-nifi

我正在使用Apache NiFi来构建我的数据流,而我目前处理的实际数据是由分隔值组成的。我想使用ExecuteScript,为了做到这一点,我已经整理了一个简单的Groovy脚本,应该执行以下操作:

1)用管道(|)

替换当前分隔符

2)用“”

替换\ r \ n和\ tab

此脚本的原因是对显示以下问题的数据集执行一些数据清理和争论:

a)文字(通常很长)通过Graphicsnew跨行。这可以在完全停止之前发生,但它不一致。

b)空白行(目前脚本尚未触及)

1)很容易完成,但2)的代码似乎没有删除制表和回车,我不知道为什么。这是代码:

\tab

感谢您的帮助。

2 个答案:

答案 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)