如何使用Pentaho将CSV文件拆分成组?

时间:2015-12-29 04:23:34

标签: pentaho pentaho-cde pentaho-spoon

我是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

1 个答案:

答案 0 :(得分:4)

我想我得到了答案。

我创建了转化in this zip,可以改变你的" csv"文件行几乎与你描述的一样,但我不知道你打算下一步做什么,所以也许你可以给我们更多细节。 =)

我将解释我的所作所为:

  

1)首先,我们使用文本输入步骤

获取行全文

Transformation

当您查看文本输入步骤的配置时,您会看到我使用了&#39 ;;'当你的输入文件使用' |'时有分隔符。所以我没有用' |'分割列。但是将整行加载到一列中。抓住行的全文,没有别的。

  

2)接下来,我们应用正则表达式eval将ID与其余字符串分开。

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

这意味着:在文本的开头,我希望一个或多个数字后跟一个管道,之后的任何内容。捕获一列中字符串开头的数字以及管道之后的所有内容到另一列。

这给你输出:(蓝色是第一个捕获组,红色是第二个) regex

  

3)现在你需要的是添加一个'序列'如果有一个row_id = 1,那只会上升。我在Mod 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

希望有帮助=)