有时候kettle中的组件不能满足需求情况下,可以使用java代码组件实现,以下是实现读取一个文本文件,但是文本文件中的分割符是个数不等的空字符,比如空格,像转为一个空格,再拆分字符串数组。这里只是一个简单用法
环境是:kettle7.0
具体组件拖拉过程不详述,这里主要介绍重点部分
上图:
文本文件输入组件中指向的文本文件内容为:
gy 0.11 0.21 0.31
ny 0.12 0.22 0.32
qx 0.13 0.23 0.33
用户自定义java class组件内容为:
import java.util.*;
private String str1;
public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException
{
Object[] r = getRow();
// If the row object is null, we are done processing.
if (r == null) {
setOutputDone();
return false;
}
//String
str1 = get(Fields.In, "col1_col2__col3").getString(r);
//String str2 = str1.replaceAll("[ ]+", " ");
//String[] a1 = str2.split(" ");// 拆分为字符串数组
String[] a1 = to_Str_arr(str1);//调用函数执行字符拆分,当然也可以直接拆分这里是顺带演示调用函数
// 赋值给输出变量
String one = a1[0];
String two = a1[1];
String three = a1[2];
String four = a1[3];
// 创建输出行,
Object[] outputRow = createOutputRow(r, data.outputRowMeta.size());
get(Fields.Out, "out_str1").setValue(outputRow, one);
get(Fields.Out, "out_str2").setValue(outputRow, two);
//putRow(data.outputRowMeta, outputRow2);
get(Fields.Out, "out_str3").setValue(outputRow, three);
//putRow(data.outputRowMeta, outputRow3);
get(Fields.Out, "out_str4").setValue(outputRow, four);
putRow(data.outputRowMeta, outputRow); // 输出行
return true;
}
// 这里主要是将字符串转换为字符串数组,不过先将多个空格经过正则替换为一个
private String[] to_Str_arr(String str){
String str1 = str;
String str2 = str1.replaceAll("[ ]+", " ");
String[] a1 = str2.split(" ");
return a1;
}
关键部分已经说明,另外可以在函数中使用putRow生成新行,也就是前一个组件中有1行数据,这里可以创建n行数据来输出给后边的组件,相当于生成行记录组件;输出变量设置:
最后执行完结果为:
out_str1;out_str2;out_str3;out_str4
gy;0.11;0.21;0.31
ny;0.12;0.22;0.32
qx;0.13;0.23;0.33