2016-05-10 39 views
0

我正在使用Apache NiFi來構建我的數據流,而我目前處理的實際數據是由分隔值組成的。我想用ExecuteScript,爲了做到這一點我已經把一個簡單的Groovy腳本,應該做到以下幾點:Groovy腳本用「」代替 r n, n和 t

1)與管道(取代目前的分隔符|)

2)替換\ r \ n和\標籤與「」

這樣做的原因腳本是做一些數據的清洗和扯皮上的數據集顯示了以下問題:

一)文本(長常)通過跨線切割\tab\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) 

謝謝你的幫助。

+0

你確定標籤實際上是ASCII碼9h和「回車」是回車和線組合feed /換行符(ASCII Dh和Ah)?請參閱http://www.asciitable.com/ –

+0

如果您逐行遍歷輸入流,我認爲您不能替換分隔線的換行符,或者加入兩條結果行。也許你可以做一個正則表達式替換? – James

+0

@EmmanuelRosa,謝謝你。我並不十分熟悉字符編碼的所有差異,但是我已經通過選項「顯示所有字符」提示了Notepad ++中的所有字符,並且LF位於每行的末尾。在某些情況下是可以的,在其他情況下,它可以任意分解長文本並進入新行。我還將當前輸出與原始輸出進行了比較,並設法擺脫\ tab和CR LF。 – paranza

回答

2

當你穿過一個有eachLine行你已經刪除了所有\r\n作爲對他們的eachLine分裂,然後給你的結果反過來。如果要刪除換行符,則不能使用eachLine,或者您可以簡單地將\nwrite()呼叫中刪除。

至於'\ t',你確定那些確實是'\ t'字符嗎?

除此之外,你不應該使用你不使用正則表達式的replaceAll()。改爲使用replace()

+0

感謝您的回覆。看看我上面的評論,我說我現在看到的角色只是每行末尾的LF。 \ t字符已經被代碼刪除了,我相信我剩下的問題如下: - 包含分隔值的每行都以LF結尾,但是我應該真的有LF當且僅當最後兩個值是數字|數值。 – paranza

+0

LF應該被移除的情況是那些長文本以某種方式斷開並向前移動一行(實際上是LF)的情況。這是我能想到的唯一的事情,以便區分我仍想保留的LF和我想要刪除的LF。不過,我不知道該怎麼去做。 – paranza

+0

還有一件事,如果我在write()調用結束時忽略了\ n,我會返回一個包含所有標題和每行所有值的單個long String。我試圖避免這種情況。我正在做一些進一步的操作,我需要所有預期的分隔值逐行。謝謝! – paranza

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)