2016-10-26 29 views
2

我進來的流文件,這在下面的格式已經固定寬度的數據:應用字符串處理/數學運算的流文件的內容在nifi

ABC 0F 15343543543454434 gghhhhhg ABC 01 433534343434 hjvh

我想有我以下面的格式輸出數據:

ABC|15|15343543543454434|gghhhhhg ABC|1|433534343434|hjvh

得到這個輸出我需要第二場轉換在每一行base10整數並應用帶操作,將所有其它字段s修剪白色空間。

我試過使用replaceText處理器,但我找不到將第二個字段轉換爲base10整數或將條形函數應用於字符串字段的方法。

回答

3

使用十六進制數字在當前版本的NiFi中並不容易。爲了使它起作用,您需要使用其中一個腳本處理器ExecuteScriptInvokeScripted處理器。

也就是說,做數字評估是我即將發佈的版本(目前正在策劃定稿)中的一個重點,並且我已經能夠創建一個只涉及ReplaceText處理器的解決方案。我使用了以下配置:

Search Value: ^(\w*)\ *(\w*)\ *(\d*)\ *(\w*)$ 
Replacement Value: $1|${'$2':prepend('0x'):append('p0'):toNumber()}|$3|$4 
Replacement Strategy: Regex Replace 
Evaluation Mode: Line-by-line 

其餘部分取決於您的用例(即,它是哪個字符集)。搜索值將爲每個部分創建捕獲組。然後在替換值中,我利用表達式語言函數中的第二個(用於十六進制數字的那個)轉換爲基數10.「append」和「prepend」的用途是在當前主數據庫上僅限小數/雙精度接受十六進制數字(我需要改進),所以我只是把它格式化爲雙精度。

所以很遺憾,這個用例目前不是開箱即用的,它很快就會出現!

編輯:我創建了一個吉拉跟蹤添加十六進制 - 在EL>這裏整數:https://issues.apache.org/jira/browse/NIFI-2950

EDIT2:一個提交解決這一問題已經被合併掌握,將在版本1.1+:https://github.com/apache/nifi/commit/c4be800688bf23a3bdea8def75b84c0f4ded243d

+0

謝謝您的回覆。不過,我有一個後續問題。我的假設是,Radix函數從基數10轉換爲任何其他基數。我的要求是將十六進制轉換爲十進制。你能解釋一下$ {'$ 2':prepend('0x'):append('p0'):toRadix(10)}如何將OF轉換爲15? 此外,我嘗試了表達式,但由於以下錯誤而失敗:java.lang.classCastException –

+0

你是對的「toRadix」我正在使用它的方式是錯誤的,但仍然正常工作。它應該替換爲「toNumber()」。該表達式所做的是將其格式化爲將被接受爲「十進制」,然後將其轉換爲整數。對於NIFI-2950,我還增加了一個「fromRadix」功能,可以從一個基座轉換爲10個基座。當您嘗試表達時,您是使用最新版本的主版本還是已發佈的NiFi版本進行操作? – JDP10101

+0

我剛剛發佈了一個Pull Request(PR),爲整數十六進制值和fromRadix()函數添加了適當的支持。請隨時對github上的PR進行測試併發布反饋。這應該允許你簡單地執行「$ {'$ 2':fromRadix(16)}」。這裏是鏈接:https://github.com/apache/nifi/pull/1161 – JDP10101