【问题标题】:Find first non-null value scanning rows backwards from current row从当前行向后查找第一个非空值扫描行
【发布时间】:2016-01-18 17:10:29
【问题描述】:

软件

我正在使用 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..n 行值。

将该文件转换为csv 后,下一行(第一行除外)的值丢失,尽管有一列未合并(参见示例id=3id=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 步骤或任何其他有效方法来实现此目的,而不使用循环文件的整个内容直到没有空行?

【问题讨论】:

    标签: javascript excel etl kettle pentaho-spoon


    【解决方案1】:

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

    【讨论】:

    • 我已将您的方法调整为更多列,对 JS 和分组步骤进行了一些明显的更改,它似乎正在工作。谢谢你。虽然,我找到了一个更简单的解决方案,但仍然测试了你的解决方案给你 +1 :)
    • 欢迎介绍更简单的解决方案。 :)
    • 按照承诺附加了另一种方法。抱歉耽搁了:)
    【解决方案2】:

    简介

    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 选项卡并将重复 选项标记为Y 用于在合并单元格中存储值的列
    • number 列上使用 Sort rows,因为 Group by 步骤需要对输入进行排序
    • Group by 在字段 number 上并聚合 nameConcatenate strings separated by 作为类型,; 作为值

    来自Pentaho User Guide

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      • 2021-12-03
      • 2021-06-16
      • 2020-03-13
      • 1970-01-01
      • 2011-01-03
      相关资源
      最近更新 更多