0

我是 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 将 CSV 拆分为多个记录

4

1 回答 1

4

我想我得到了答案。

在这个 zip中创建了转换,它可以像你描述的那样将你的“csv”文件转换成行,但我不知道你接下来打算做什么,所以也许你可以给我们更多细节。=)

我将解释我做了什么:

1)首先,我们使用文本输入步骤抓取行全文

转型

当您查看文本输入步骤的配置时,您会看到我使用了 ';' 有分隔符,当您的输入文件使用 '|' 所以我没有用“|”分割列 但将整行加载在一列中。抓取行的全文,仅此而已。

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

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

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

这给了你这个输出:(蓝色是第一个捕获组,红色是第二个) 正则表达式

3)现在您需要添加一个“序列”,只有在 row_id = 1 时才会上升。我在 Mod JS Value 中使用以下代码执行了该操作:

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
    }
}

这会给你这个似乎是你所期望的输出:(绿色,组/序列完成)

顺序

希望它有帮助=)

于 2016-01-04T20:47:24.407 回答