从当前行向后查找第一个非空值扫描行
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=3
、id=6
) .
我正在使用步骤 Add sequence
生成 sequence
,输入按其最初存储在文件中的方式排序。
实现目标的步骤
基本上我需要做的是:
- 找到
sequence_number
小于 current_row.sequence_number
的第一个非空值
- 将字段
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
数字),但我不知道这些功能,如果它们确实存在。
我如何使用 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
和 ;
作为价值
Repeat If set to Y, will repeat this value if the field in the next row is empty.
软件
我正在使用 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=3
、id=6
) .
我正在使用步骤 Add sequence
生成 sequence
,输入按其最初存储在文件中的方式排序。
实现目标的步骤
基本上我需要做的是:
- 找到
sequence_number
小于current_row.sequence_number
的第一个非空值
- 将字段
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
数字),但我不知道这些功能,如果它们确实存在。
我如何使用 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
和;
作为价值
Repeat If set to Y, will repeat this value if the field in the next row is empty.