2

我正在处理/etc/group来自系统的文件。CSV input我用分隔符 step加载它:。它有四个字段:group, pwfield, gid, members。该members字段是一个逗号分隔的列表,其中未指定计数的帐户名称从 0 到无限。

我想生成一个包含三个字段的记录列表:group, gid, account。第一步我用User Defined Java Class,第二步我用Select values

示例输入:

root:x:0:
first:x:100:joe,jane,zorro
second:x:101:steve

示例输出 (XLS) - 预期:

group   gid account
first   100 joe
first   100 jane
first   100 zorro
second  101 steve

示例输出 (XLS) - 实际错误:

group   gid account
first   100 zorro
first   100 zorro
first   100 zorro
second  101 steve

用户定义的 Java 类:

public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException
{
    // boilerplate
    Object[] r = getRow();
    if (r == null) {
        setOutputDone();
        return false;
    }
    String tmp = get(Fields.In, "members").getString(r);
    if(null==tmp)
        return true;
    String accounts[] = tmp.split(",");
    for(int i=0; i<accounts.length; ++i){
        Object[] out_row = createOutputRow(r, data.outputRowMeta.size());
        String account = accounts[i];
        get(Fields.Out, "account").setValue(out_row,account);
        putRow(data.outputRowMeta, out_row);
    }

    return true;
}

我相信我错过了调用某些管理功能,或者我应该使用createOutRow(). 谷歌没有帮助。

水壶改造图

神奇的是,如果我创建一个如图所示的转换,那么

  • XLS debug Aaccount每行都有正确的值
  • XLS debug B具有重复account值,如示例输出。

如果我Dummy在之前放置一个步骤Select values 7,则XLS debug B变得正确并XLS debug A变得糟糕。

4

1 回答 1

3

问题出在以下行(for循环中的第一行):

Object[] out_row = createOutputRow(r, data.outputRowMeta.size());

它应该替换为这三行:

Object[] out_row = RowDataUtil.allocateRowData(data.outputRowMeta.size());
for (int j=0; j<r.length; ++j)
    out_row[j] = r[j];

更新:一种更简单的方法,本质上是相同的:

Object[] out_row = RowDataUtil.createResizedCopy(r, data.outputRowMeta.size());
于 2011-10-10T14:41:37.567 回答