Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 查找从当前行向后扫描行的第一个非空值 软件_Javascript_Excel_Etl_Kettle_Pentaho Spoon - Fatal编程技术网

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

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中的值

我使用的是Pentaho数据集成5.4

输入数据和解释 从文件输入数据(简化,有更多列):

问题是我有一个
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