我正在处理一个 /etc/group
来自系统的文件。我加载 CSV input
使用分隔符步进 :
.它有四个字段: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 A
有正确 account
每行中的值 XLS debug B
有重复 account
值如示例输出。 如果我放置一个
Dummy
前一步Select values 7
, XLS debug B
变得正确和 XLS debug A
变坏。
最佳答案
问题出在以下行(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());
关于java - 水壶:processRow() 中的多个 putRows() 正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7713838/