如何使用 Pentaho 将 CSV 文件拆分成组?
How to split a CSV file into groups using Pentaho?
我是 Pentaho 的新手,正在尝试读取 CSV 文件(我已经这样做了)并根据标识符创建数据块。
Eg
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
Eg
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
我想我找到了答案。
我创建了转换 in this zip,可以像您描述的那样按行转换您的 "csv" 文件,但我不知道您下一步打算做什么,所以也许您可以给我们更多细节。 =)
我会解释我做了什么:
1) First, we grab the row full text with a Text input step
当您查看文本输入步骤的配置时,您会看到我使用了“;”有分隔符,当你的输入文件使用'|'所以我没有用'|'拆分列但将整行加载到一列中。获取该行的全文,仅此而已。
2) Next we apply a regex eval to separate the ID from the rest of our string.
^(\d+)\|(.*)
这意味着:在文本的开头,我希望有一个或多个数字后跟竖线以及之后的任何内容。捕获一列中字符串开头的数字以及管道后的所有内容到另一列。
这给你这个输出:(蓝色是第一个捕获组,红色是第二个)
3) Now what you need is to add a 'sequence' that only goes up if there is a row_id = 1. Which I did in the Mod JS Value with the following code:
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
}
}
这将为您提供看起来符合您预期的输出:(绿色,group/sequence 完成)
希望对您有所帮助=)
我是 Pentaho 的新手,正在尝试读取 CSV 文件(我已经这样做了)并根据标识符创建数据块。
Eg
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
Eg
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
我想我找到了答案。
我创建了转换 in this zip,可以像您描述的那样按行转换您的 "csv" 文件,但我不知道您下一步打算做什么,所以也许您可以给我们更多细节。 =)
我会解释我做了什么:
1) First, we grab the row full text with a Text input step
当您查看文本输入步骤的配置时,您会看到我使用了“;”有分隔符,当你的输入文件使用'|'所以我没有用'|'拆分列但将整行加载到一列中。获取该行的全文,仅此而已。
2) Next we apply a regex eval to separate the ID from the rest of our string.
^(\d+)\|(.*)
这意味着:在文本的开头,我希望有一个或多个数字后跟竖线以及之后的任何内容。捕获一列中字符串开头的数字以及管道后的所有内容到另一列。
这给你这个输出:(蓝色是第一个捕获组,红色是第二个)
3) Now what you need is to add a 'sequence' that only goes up if there is a row_id = 1. Which I did in the Mod JS Value with the following code:
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
}
}
这将为您提供看起来符合您预期的输出:(绿色,group/sequence 完成)
希望对您有所帮助=)