Javascript 查找从当前行向后扫描行的第一个非空值 软件
我使用的是Pentaho数据集成5.4 输入数据和解释 从文件输入数据(简化,有更多列): 问题是我有一个Javascript 查找从当前行向后扫描行的第一个非空值 软件,javascript,excel,etl,kettle,pentaho-spoon,Javascript,Excel,Etl,Kettle,Pentaho Spoon,我使用的是Pentaho数据集成5.4 输入数据和解释 从文件输入数据(简化,有更多列): 问题是我有一个Excel文件格式xlsx,其中包含合并单元格的数据,对于id的一个值,有1..n行值 将该文件转换为csv后,下一行(第一行除外)的值将丢失,尽管有一列未合并(参见示例id=3,id=6) 我正在使用步骤Add sequence生成一个序列,输入按照最初存储在文件中的方式进行排序 实现目标的步骤 基本上我需要做的是: 查找第一个非空值,该值的序列号小于当前行。序列号 将字段name中的值
Excel
文件格式xlsx
,其中包含合并单元格的数据,对于id
的一个值,有1..n
行值
将该文件转换为csv后,下一行(第一行除外)的值将丢失,尽管有一列未合并(参见示例id=3
,id=6
)
我正在使用步骤Add sequence
生成一个序列
,输入按照最初存储在文件中的方式进行排序
实现目标的步骤
基本上我需要做的是:
- 查找第一个非空值,该值的
序列号
小于当前行。序列号
- 将字段
name
中的值连接到匹配行
- 继续扫描下一行,其序列号高于上次扫描的序列号
如前所述,对于这种情况,可以有1..n
行值
预期产量
我的方法
我相信我能够在循环中做到这一点,通过使用分析查询
并计算滞后(1)
,然后将一行的名称
列与空值连接起来,并从空行中丢弃其他列值,然后在循环中执行此操作(假设最大值为20次),但我认为这是个坏主意。
可能有更好的方法来实现这一结果,例如使用Java脚本
step从当前向后扫描行(基于sequence
number),但我不知道这些函数是否存在
如何使用Modified Java Script Value
步骤或任何其他有效方法来实现这一点,而无需对文件的整个内容使用循环,直到没有空行为止?要解决这一问题,我将使用Modified Java Script Value
保存最后看到的产品,并将其用于所有行,然后使用groupby
对列进行分组
导言
下图显示了Excel文件中合并的相邻单元格
当作为纯文本文件打开时,它实际上会为每一行创建间隙(来自合并单元格的数据丢失),但第一行包含合并单元格
number name
1000/P um6p1
um1p2
um1p3
1500 um2p1
9823 um3p1
83424 um4p1
um4p2
um4p3
um4p4
21390 um5p1
虽然@bolav的答案解决了这个问题,但在Kettle
中有一种更简单、可能更有效的方法来解决这个问题
方法
- 在
Microsoft Excel输入
步骤中,转到字段
选项卡,并将重复选项标记为Y,用于在合并单元格中存储值的列
- 对数字列使用
排序行
,因为分组依据
步骤需要对输入进行排序
根据
对字段编号和聚合名称进行分组,并将
分隔的字符串连接为类型和代码>作为值
发件人:
Repeat如果设置为Y,则将在下一行中的字段为空时重复此值
我已经将您的方法调整为更多的列,在JS和分组步骤中做了一些明显的更改,而且似乎很有效。非常感谢。虽然,我找到了一个更简单的解决方案,但仍然测试了您的解决方案,使您获得+1:)请随意讲述更简单的解决方案。:)附上另一个承诺的方法。抱歉耽搁了:)
number name
1009 ProductA
2150 ProductB
3235 ProductC; ProductD; ProductE
1234 ProductF
7765 ProductG
4566 ProductH; ProductI
9907 ProductJ
number name
1000/P um6p1
um1p2
um1p3
1500 um2p1
9823 um3p1
83424 um4p1
um4p2
um4p3
um4p4
21390 um5p1