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

Find first non-null value scanning rows backwards from current row

软件

我正在使用 Pentaho 数据集成 5.4

输入数据和解释

从一个文件中输入数据(简化,多列):

number       name
1009       ProductA
2150       ProductB
3235       ProductC
           ProductD
           ProductE
1234       ProductF
7765       ProductG
4566       ProductH
           ProductI
9907       ProductJ

问题是我有一个 Excel 文件格式 xlsx,其中包含合并单元格的数据,对于 id 的一个值,有 1..n 行值。

将该文件转换为 csv 后,下一行(第一行除外)的值丢失,尽管其中一列未合并(参见示例 id=3id=6) .

我正在使用步骤 Add sequence 生成 sequence,输入按其最初存储在文件中的方式排序。

实现目标的步骤

基本上我需要做的是:

如前所述,这种情况下可以有 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 数字),但我不知道这些功能,如果它们确实存在。

我如何使用 Modified Java Script Value 步骤或任何其他有效的方式来实现此目的而不对文件的整个内容使用循环直到没有空行?

为了解决这个问题,我会使用 Modified Java Script Value 来保存最后一次看到的产品并将其用于所有行,然后使用 Group By 对列进行分组。

简介

Excel 文件中的合并相邻单元格如下图所示。

当作为纯文本文件打开时,它实际上会为每一行创建间隙(合并单元格中的数据丢失),但第一个包含合并单元格。

number  name
1000/P  um6p1
        um1p2
        um1p3
1500    um2p1
9823    um3p1
83424   um4p1
        um4p2
        um4p3
        um4p4
21390   um5p1

虽然 @bolav 的回答解决了这个问题,但在 Kettle.

中有一个更简单且可能更有效的方法来解决这个问题

方法

  • Microsoft Excel Input 步骤转到 Fields 选项卡并将 Repeat 选项标记为 Y 用于存储的列合并单元格中的值
  • number 列上使用 Sort rows 因为 Group by 步骤需要对输入进行排序
  • Group by 在字段 number 上聚合 name 类型 Concatenate strings separated by;作为价值

来自 Pentaho User Guide:

Repeat If set to Y, will repeat this value if the field in the next row is empty.