从当前行向后查找第一个非空值扫描行
软件
我正在使用Pentaho数据集成5.4
input数据和说明
从文件input数据(简化,有更多的列):
number name 1009 ProductA 2150 ProductB 3235 ProductC ProductD ProductE 1234 ProductF 7765 ProductG 4566 ProductH ProductI 9907 ProductJ
问题是,我有一个Excel
文件格式的xlsx
,其中包含合并单元格的数据,对于一个id
值,有1..n
行值。
尽pipe没有合并一列(参见示例id=3
, id=6
),但是将该文件转换为下一行(除第一个以外)的csv
值后仍然丢失。
我使用步骤Add sequence
生成一个sequence
,input按原始存储在文件中的方式sorting。
实现目标的步骤
基本上我需要做的是:
- 查找
sequence_number
小于current_row.sequence_number
第一个非null值 - 将字段
name
的值连接到匹配的行 - 继续扫描
sequence_number
高于上次扫描的下一行
如前所述,这种情况下可能有1..n
行值。
预期产出
number name 1009 ProductA 2150 ProductB 3235 ProductC; ProductD; ProductE 1234 ProductF 7765 ProductG 4566 ProductH; ProductI 9907 ProductJ
我的方法
我相信我可以通过使用Analytic Query
并计算LAG(1)
,然后将一行的列name
与空值连接起来,并从空行中丢弃其他列值,然后在一个循环中执行此操作循环(假设这是最大的20倍),但我认为这是一个坏主意。
有可能有更好的方法来实现这个结果使用例如Java Script
步骤从当前(基于sequence
号)向后扫描行,但我不知道这些function,如果他们确实存在。
我怎样才能实现这个使用Modified Java Script Value
步骤,或任何其他有效的方法,而不是使用循环的文件的整个内容,直到没有空行?
为了解决这个问题,我将使用Modified Java Script Value
来保存上次看到的产品,并将其用于所有行,然后使用Group By
对列进行分组。
介绍
合并Excel文件中的相邻单元格显示在下面的图像中。
当以纯文本文件打开时,它实际上会为每一行创build间距(来自合并单元格的数据丢失),但首先包含合并的单元格。
number name 1000/P um6p1 um1p2 um1p3 1500 um2p1 9823 um3p1 83424 um4p1 um4p2 um4p3 um4p4 21390 um5p1
虽然@bolav答案解决了这个问题,但是对于这个问题,在Kettle
有一个更简单,更有效的方法。
途径
- 在“
Microsoft Excel Input
步骤中,转到“Fields
选项卡,并将“ 重复”选项标记为Y ,以存储合并单元格中的值 - 使用对数字列进行
Sort rows
,因为Group by
需要对input进行sorting -
Group by
字段编号和聚合名称Group by
按typesConcatenate strings separated by
;
作为价值
从Pentaho用户指南 :
重复如果设置为Y,如果下一行中的字段为空,则重复此值。