从当前行向后查找第一个非空值扫描行

软件

我正在使用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=3id=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对列进行分组。

转型

使用Javascript

一步一步

产量

介绍

合并Excel文件中的相邻单元格显示在下面的图像中。

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,如果下一行中的字段为空,则重复此值。

转型

一步一步

执行结果