2015-12-29 37 views
0

我是Pentaho的新手,正在嘗試讀取CSV文件(我已經這樣做)並根據標識符創建數據塊。如何使用Pentaho將CSV文件分成組?

例如

1|A|B|C 
2|D|E|F 
8|G|H|I|J|K 
4|L|M 
1|N|O|P 
4|Q|R|S|T 
5|U|V|W 

我需要拆分和基本爲這樣:
(每個塊開始時在第一列等於 '1')

塊a)

1|A|B|C 
2|D|E|F 
8|G|H|I|J|K 
4|L|M 

B座)

1|N|O|P 
4|Q|R|S|T 
5|U|V|W 

a |1|A|B|C 
a |2|D|E|F 
a |8|G|H|I|J|K 
a |4|L|M 

b |1|N|O|P 
b |4|Q|R|S|T 
b |5|U|V|W 

怎麼可以這樣使用Penatho實現?謝謝。

我發現了一個類似的問題,但答案並不真正幫助我的情況下 Pentaho Kettle split CSV into multiple records

+0

這是不規則的CSV數據。首先它是不正確的;其次它是位置的(意味着行需要知道它們相對於其他行的位置)。你可能最好用JavaScript來處理它。你能更詳細地說明你將要對每個街區做什麼嗎?也許還有另一種方法。 –

+0

您是否需要將不同的塊保存到不同的文件中? – bolav

+0

@ Brian.D.Myers我需要處理id(每個塊內的行連接的管道分隔值),並使用它從數據庫中提取數據。然後,我將需要該數據塊根據數據庫中的數據生成報告。 –

回答

4

我想我得到了答案。

我創建了轉換in this zip,它可以將行中的「csv」文件轉換成幾乎和您所描述的一樣的行,但我不知道您打算接下來做什麼,所以也許可以給我們更多的細節。 =)

我會解釋我做了什麼:

1)首先,我們搶行全文使用文本輸入步驟

Transformation

當你看文本輸入步驟的配置,你會看到我用';'有分隔符,當你的輸入文件使用'|'所以我不會用'|'分隔列但將整行加載到一列中。抓住行的全文,沒有別的。

2)接下來我們應用一個正則表達式eval來區分ID和我們其餘的字符串。

^(\d+)\|(.*) 

這意味着:在文本的開始,我希望一個或多個數字後跟後的管道和任何東西。捕獲一列中字符串開頭的數字和管道後面的所有數字到另一列。

這就給了你這樣的輸出:(藍色是第一個捕獲組,紅色是第二個) regex

3)現在,你需要的是增加一個「序」,只有上升,如果有是ROW_ID = 1。這是我在國防部JS值也不用下面的代碼:

var sequence 

//if it's the first row, set sequence to 1 
if(sequence == null){ 
    sequence = 1; 
}else{ 
//if it's not the first row, check if the row_id is equal to 1 (string) 
    if(row_id == '1'){ 
     // increment the sequence 
     sequence++; 
    }else{ 
     //nothing 
    } 
} 

這會給你這個輸出,似乎是您所期望的:(綠色,組/序列完成)

sequence

希望它能幫助=)