【问题标题】:Copy previous values kettle pentaho复制以前的值kettle pentaho
【发布时间】:2015-05-13 16:26:32
【问题描述】:

我有一个问题,我正在循环处理它! :|我希望有人可以帮助我..

所以我有一个输入文件 (.xls),这很简单,但有一行(可以说它的“ROW1”)是这样的:

  1. 第 1 行 |第 2 行 |第 3 行 | ROW_N
  2. 765 | 1 | AAAA-MM-DD | ...
  3. 空 | 1 | AAAA-MM-DD | ...
  4. 空 | 1 | AAAA-MM-DD | ...
  5. 944 | 2 | AAAA-MM-DD | ...
  6. 空 | 2 | AAAA-MM-DD | ...
  7. 088 | 7 | AAAA-MM-DD | ...
  8. 555 | 2 | AAAA-MM-DD | ...
  9. 空 | 2 | AAAA-MM-DD | ...

这里没有标准,就像你看到的那样。有一些行为空(ROW1),在 ROW2 中,有相同的数字,与 ROW1 的关联不同(如在第 5 行和第 6 行,然后在第 8 行和9).

我的目标是复制并粘贴 ROW1 中的值,在 ROW1 中,当为空时,直到不为空。基本上是复制form上一步,什么时候为null...

我正在尝试使用“公式”步骤,例如:

=IF(AND(ISBLANK([ROW1]);NOT(ISBLANK([ROW2]));ROW_n=ROW1;IF(AND(NOT(ISBLANK([ROW1]));NOT(ISBLANK([ROW2] ));ROW_n=ROW1;ROW_n=""));

但是什么都没有……

我尝试过“分析查询”,但也没有尝试过..

我只使用流式传输 xls 文件输入..

非常感谢,非常感谢任何帮助!

最好的问候!

【问题讨论】:

  • 目前看来唯一的选择是Modified Java Script Value 步骤。在 Analytic Query 步骤中有一个开放的 Jira 可以解决这个问题,但它还没有。试试 Java Script 步骤。

标签: integration pentaho etl kettle pdi


【解决方案1】:

我发现了一个解决方案,使用以下代码添加“用户定义的 Java 类”:

import java.util.HashMap; private FieldHelper output_field, card_field; private RowSet out, log; private String previou_card =null;

public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException {

if (first)
{
    first = false;
    out = findTargetRowSet("out");

    output_field = get(Fields.Out, "previous_card");
} else {
    Object[] r = getRow();
    if (r == null) {
        setOutputDone();
        return false;
    }

    r = createOutputRow(r, data.outputRowMeta.size());
    if (previous_card != null) {
        output_field.setValue(r, previous_card);
    }

    if (card_field == null) {
        card_field = get(Fields.In, "Grupo de Cartões");
    }

    String card = card_field.getString(r);
    if (card != null && !card.isEmpty()) {
        previous_card = card;
    }
    // Send the row on to the next step.
    putRowTo(data.outputRowMeta, r, out);
}
return true;

在此之后我必须采取一些步骤,但这非常有帮助。

谢谢小伙伴们!!

【讨论】:

  • +1 足智多谋。您几乎可以通过 UDJC 步骤(用户定义 Java 类)实现任何目标
  • 谢谢@YuvalHerziger!!我同意 UDJC 步骤。我只需要多练习一点我的 Java ;) 最好的问候
  • 不客气。请记住,当您每天编写转换时,UDJC 会让人上瘾。在 90% 的用例中,使用其他步骤会更简单、更易读,并且让其他开发人员可以清楚地了解您的意图
【解决方案2】:

最后我得到了结果。请按照以下步骤操作

  1. 下图是完整的转换屏幕。

  2. 数据网格数据将是这样的。抱歉,在我的本地我没有 Microsoft,因为我使用了 Data Grid。您可以拖放 Microsoft Excel 输入步骤,而不是数据网格。

  1. 拖放一个 java 脚本步骤并编写以下代码。

  1. 转换的最后一步,拖放选择值步骤并选择列。(这些步骤不是必需的)

  1. 最终结果会是这样。

希望这会有所帮助。

【讨论】:

  • 感谢您的回答,您让我走上了正轨,但您的代码还不够。
  • 我不会使用这个解决方案,因为它不能满足问题中描述的需求。如果您想递归操作行,UDJC 将是默认选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 2014-01-17
  • 1970-01-01
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
相关资源
最近更新 更多