如何在Pentaho Text File Input中合并拆分的文本记录?
如何在Pentaho中合并两行记录为单行?
我有以下格式的文本文件:
1 23/08/17 01:29:41 40 0210 6019004522702859 10,000,000.00 0.00 7000 0000JH 005771 APP 00 00 006716 30 S1G9986387 123-6521071921 BEKASI 2 23/08/17 03:38:33 40 0210 6019004521299402 3,300,000.00 0.00 7000 0000VG 011250 APP 00 00 280110 30 S1ACMB9503 123-8225022594 3 23/08/17 04:45:00 40 0210 6019004508194352 5,000,000.00 0.00 7000 000117 014015 APP 00 00 282177 30 S1ACMB9503 123-7025047324 4 23/08/17 05:02:00 40 0210 6019004521299402 700,000.00 0.00 7000 00014D 015036 APP 00 00 282944 30 S1ACMB9503 123-8225022594 5 23/08/17 06:03:30 40 0210 6019004521269470 3,670,000.00 0.00 7000 0001RT 024220 APP 00 00 289871 30 S1ACMB9503 123-1122501295 6 23/08/17 06:08:26 40 0210 6019002662198912 1,000,000.00 0.00 7000 0001UR 025341 APP 00 00 290705 30 S1ACMB9503 123-1152511520 7 23/08/17 06:27:51 40 0210 6019002674210655 15,000,000.00 0.00 7000 00029J 030585 APP 00 00 294279 30 S1ACMB9503 123-1132116951 8 23/08/17 06:38:59 40 0210 6019002666264330 900,000.00 0.00 7000 0002LA 001833 APP 00 00 296752 30 S1ACMB9503 123-1121109898 9 23/08/17 06:54:58 40 0210 6019004009652312 200,000.00 0.00 7000 00039O 008300 APP 00 00 000597 30 S1G997Z73P 123-1025591061 PONTIANAK 10 23/08/17 07:01:29 40 0210 6019004521630044 875,000.00 0.00 7000 0003KZ 011350
我尝试用Pentaho的Text File Input组件读取,但结果不符合预期,想要把每两行组成的记录合并成单行,示例如下:
1 23/08/17 01:29:41 40 0210 6019004522702859 10,000,000.00 0.00 7000 0000JH 005771 APP 00 00 006716 30 S1G9986387 123-6521071921 BEKASI 2 23/08/17 03:38:33 40 0210 6019004521299402 3,300,000.00 0.00 7000 0000VG 011250 APP 00 00 280110 30 S1ACMB9503 123-8225022594
解决方案
方法一:直接修改Text File Input的行记录设置
这是最简单的方式,适合规则的两行一组的文件:
- 打开Text File Input的配置界面,切换到Content标签页
- 找到Number of lines per row选项,输入
2 - 保存配置后运行,组件会自动把每两行合并成一条记录,直接得到你要的格式
方法二:用脚本手动合并(应对不规则行情况)
如果文件存在偶尔的行异常,可以用自定义逻辑处理:
- 用Text File Input读取每一行,把每行内容存到一个字段(比如命名为
raw_line) - 添加Modified Java Script Value组件,定义两个变量:
odd_line(存奇数行内容)、is_odd(标记当前行是否为奇数行,初始值设为true) - 编写脚本逻辑:
if (is_odd) { odd_line = raw_line; is_odd = false; // 奇数行不输出,暂存内容 skipRow(); } else { merged_line = odd_line + " " + raw_line.trim(); is_odd = true; // 偶数行和暂存的奇数行拼接后输出 } - 后续可以根据需求拆分
merged_line为具体字段
方法三:用关联组件合并
适合需要更灵活控制的场景:
- 用Text File Input读取所有行,添加一个自增的序列字段(比如
row_num,可以用Add Sequence组件实现) - 用Filter Rows组件拆分出奇数行(条件:
row_num % 2 == 1)和偶数行(条件:row_num % 2 == 0) - 对偶数行的
row_num做减法:row_num = row_num - 1,让奇数行和对应偶数行的row_num一致 - 使用**Combine Rows (cartesian)**组件,通过
row_num关联两行,把两行内容拼接成单行
内容的提问来源于stack exchange,提问作者Alfian Irdandi
相关产品推荐
相关产品推荐

