2014-04-15 80 views
1

我正在使用TalenD studio將大約80個日誌文件合併爲1個巨型文件。這些文件只是標準的txt文件。我目前有一份工作可以將所有文件合併(他們使用相同的標題和格式),但我的問題如下。TalenD從一列中提取信息並輸入到另一列

第一列包含用戶登錄ID,如果用戶運行在服務器上,則會在日誌中捕獲它,如果它們本地運行則不是。我需要做的是當登錄ID爲Null/Blank時,從位於第4列的文件路徑中找到登錄名。

路徑設置爲eitehr C:\ Documents and Settings(登錄ID這裏)....或C:\ Users(登錄ID在這裏)....或C:\ DOCUME〜1(登錄ID在這裏)...所以它總是在第二組反斜槓之間。但是,我是TalenD的新手,不確定要在表達式中放入什麼,以便將這些數據提取出來並放入登錄ID字段中。

如果任何人有辦法做到這一點,或可以帶領我在正確的方向,這將是非常有益的!

回答

2

如果登錄ID字段爲空或空白,您可以使用tExtractRegexFields組件從您的文件路徑中提取登錄ID,然後有條件地將其映射到tMap中的登錄ID列。

一個典型的工作要做,這可能是這樣的:

Typical job set up

這有(一tFixedFlowInput組件硬編碼值工作在這種情況下),數據的輸入,tExtractRegexFields組件從文件路徑列中提取登錄ID,然後提取組件以有條件地映射數據。

Log data

在上述tFixedFlowInput組件的值有你在日誌中看到的,也表明一個登錄ID,它是對一個在你的文件路徑不同,所以你可以看到你贏了」的實例的組合t總是會覆蓋您的登錄標識並只在必要時使用文件路徑中的標識。

之後,我們需要配置tExtractRegexField以查看文件路徑列並嘗試查找捕獲組。我使用了正則表達式"^C:\\\\(?:Users|DOCUME~1|Documents and Settings)\\\\(\\w+)\\\\",它會捕獲任何「字樣」字符,直到出現反斜槓。您可能必須調整此功能才能爲用戶獲得正確的結果。 tExtractRegexField組件的架構還要求您爲每個捕獲組添加額外的列(這也是爲什麼我將交替組設爲一個被動組的原因),它將按順序填充這些列。因此,如果您的正則表達式中有3個捕獲組,但只有2個額外字段,則只會使用前2個捕獲組。

最後,我們使用一些簡單的邏輯在我們tMap組件使用在必要時提取出的登錄ID:

tMap configuration

在這裏,我們定義了測試的登錄字段是否爲空或空白和一個布爾變量如果是這樣,我們使用先前定義的regexLogin值,否則我們使用原始登錄值。

而這裏的結果:

Output results

通知我們如何成功地從3個空或沒有用戶ID條目抓住用戶ID,也是我們如何按照原先的登錄ID時,有之間的衝突登錄標識和我們從文件路徑中提取的標識。

+0

我真的不知道如何實現這一點。我對TalenD非常陌生,並且遵循你的步驟對我來說並不是很合適。我覺得我缺少一些東西。例如,「tExtractRegexField組件的模式也需要爲每個捕獲組添加額外的列(這也是爲什麼我將交替組設爲一個被動組的原因),並且它會按順序填充這些列。」我不知道我應該在這裏做什麼,我應該編輯和添加列到架構?我不確定你的意思是交替和被動組合。 :/ – mw90

+1

對於每個活動捕獲組(由不以'?:'開頭的圓括號表示),您需要向您的模式添加一列。該列將包含正則表達式中捕獲組的內容。在[正則表達式101](http://www.regex101.com)中使用正則表達式,以便您可以讓您的捕捉組合恰到好處。 – ydaetskcoR

0

你必須編寫Java代碼在你的TMAP變量或如下表達 例子(應該進行修改,以滿足您的要求)

String strtemp = "C:\\document settings\\userid"; 
System.out.println(strtemp.substring(strtemp.lastIndexOf("\\")+1)); 
相關問題