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

时间:2016-01-18 17:10:30

标签: javascript excel etl kettle pentaho-spoon

软件

我正在使用Pentaho Data Integration 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..ncsv

在将该文件转换为id=3之后,下一行(除了第一行)的值丢失了,尽管有一列没有合并(参见示例id=6sequence)。 / p>

我正在使用步骤Add 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,然后将列Java Script连接为具有空值的一行并丢弃其他列来自null行的值 - 然后在循环中执行此操作(假设这是最大值的20次),但我确实认为这是一个坏主意。

使用例如sequence步骤从当前向后扫描行(基于Modified Java Script Value数字)可能有更好的方法来实现此结果,但我不知道这些函数,如果它们确实存在。

如何在没有空行的情况下使用string input = "my,string,separated,by,commas"; string[] groups = input.Split(','); string[] output = groups .Select((x, idx) => x + (idx < groups.Length - 1 ? "," : string.Empty)) .Where(x => x != "") .ToArray(); 步骤或任何其他有效方式实现此目的,而不使用循环来处理整个文件内容?

2 个答案:

答案 0 :(得分:1)

要解决此问题,我会使用Modified Java Script Value保存上次看到的产品并将其用于所有行,然后使用Group By对列进行分组。

Transformation

Javascript

Group by step

Output

答案 1 :(得分:1)

简介

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

Excel file with merged cells

当作为纯文本文件打开时,它实际上为每一行创建了间隙(来自合并单元格的数据),但首先包含合并的单元格。

delegate = MapController()

虽然 @bolav 答案解决了这个问题,但在number name 1000/P um6p1 um1p2 um1p3 1500 um2p1 9823 um3p1 83424 um4p1 um4p2 um4p3 um4p4 21390 um5p1 中解决此问题的方法更为简单且可能更有效。

方法

  • Kettle步骤中,转到Microsoft Excel Input标签,并将重复选项标记为 Y ,用于存储合并单元格中的值的列
  • number 列上使用Fields,因为Sort rows步骤需要对输入进行排序
  • Group by字段并汇总名称,其中Group by为类型,Concatenate strings separated by为值

来自Pentaho User Guide

  

重复如果设置为Y,如果下一行中的字段为空,则会重复此值。

Transformation

Group by step

Execution results