KETTLE使用javascript步骤过滤特殊字符

KETTLE使用javascript步骤过滤特殊字符

 

使用kettle在抽取大量excel数据时,总是遇到excel中有一些特殊字符,导致ExecuteSQL script步骤执行失败,本文记录一些方法过滤一些特殊字符。同行有更好的方式实现,欢迎指点,共同学习。

 

完整的实现转换截图如下

1、  使用javascript步骤过滤所有string字段的字符

 

使用javascript步骤可以通过代码来实现,避免增加过多的步骤,且一次性过滤所有的字段;代码如下:

 

for (vari=0;i<getInputRowMeta().size();i++){ /

  var valueMeta= getInputRowMeta().getValueMeta(i);

 

  if (valueMeta.getTypeDesc().equals("String")) {

    var fStr= row[i];

    fStr=replace(row[i],'\n','');

    fStr=replace(fStr,'\r','');

    fStr=replace(fStr,'\t',' ');

 

    fStr=replace(fStr,';','');

    fStr=replace(fStr,'·','');

   fStr=replace(fStr,"'","''");

 

    row[i]=fStr;

  }

}

2、 使用正则表达式,过滤重复字符

实际项目中遇到excel文件中有若干个-号,数量不确定,上面的方式就不行了,replace in String步骤可以解决。useRegEx是开关,确定是否使用正则表达式,search 中填入表达式,replaceWith使用字符串去替换。

 

 

3、 截取长度

如果数据源的内容超过数据库字段长度,插入报错,使用String cut步骤可以实现;

 

 

<think>嗯,用户想在Kettle里用JavaScript代码来统计总分。那我得先回忆一下Kettle里的JavaScript组件是怎么工作的。根据引用[1],KettleJavaScript组件允许用户用脚本修改数据,对吧?那用户需要汇总字段的值,应该需要遍历行里的各个数值字段,然后累加。 首先,用户需要确定哪些字段是数值类型的,因为在处理时可能得区分不同类型。引用[3]里的例子有检查字段类型是否是Number,然后转换成数字进行累加。所以这可能是个关键步骤。用户需要先获取每一行的字段,然后判断类型,如果是数值类型,就累加到总分变量里。 然后,用户需要在JavaScript代码组件里初始化总分变量,可能在var之前的部分,比如var 总分 = 0;然后在每行处理的时候,循环各个字段,判断类型并累加。接着把总分赋值给一个新的字段,比如total_score。 不过要注意,KettleJavaScript组件处理的是每一行数据,所以可能需要确保每个输入行都有需要统计的字段。另外,变量作用域的问题,总分变量是否需要是全局的,或者每行独立?可能需要用row对象来存储中间结果,或者使用全局变量? 还有,用户可能需要连接各个组件,比如Excel输入,JavaScript代码组件,然后输出。引用[2]提到了如何将组件拖到工作区并连接起来,所以用户需要正确设置组件的连接顺序。 另外,数据类型转换的问题,比如字符串转数字,引用[3]里的str2num函数可能有用,或者用JavaScript的parseFloat函数。需要确保转换正确,避免NaN的情况。 最后,测试代码是否正确,可能需要输出总分,或者进行调试。用户可能需要查看处理后的数据,确认总分是否正确累加。 总结步骤应该是:添加JavaScript组件,遍历字段,判断数值类型,累加,存储总分到新字段。同时要注意组件的连接和变量的作用域处理。</think>### 分步实现指南 #### 步骤1:添加JavaScript代码组件 1. 在Kettle转换工程中,从【核心对象】选项卡中找到【脚本】分类 2. 拖拽【JavaScript代码】组件到工作区 3. 建立数据流连接(如:Excel输入 → JavaScript代码 → 输出组件)[^2] #### 步骤2:编写字段遍历逻辑 ```javascript // 初始化总分变量 var 总分 = 0; // 遍历所有字段 for (var i=0; i<getInputRowMeta().size(); i++) { var valueMeta = getInputRowMeta().getValueMeta(i); var fieldValue = row[i]; // 类型判断与数值转换 if (valueMeta.isNumeric()) { 总分 += parseFloat(fieldValue); // 确保处理空值情况 } } // 输出结果 trans_Status = CONTINUE_TRANSFORMATION; ``` *注:`getInputRowMeta()`可获取字段元数据,`row[]`数组包含当前行数据* #### 步骤3:创建新输出字段 1. 在组件属性面板的【字段】选项卡 2. 添加新字段(如:字段名称`total_score`,类型为Number) #### 步骤4:数据类型处理优化 ```javascript // 增强型数值处理 if (valueMeta.isNumeric() && !isNaN(fieldValue)) { 总分 += (valueMeta.getType() == ValueMetaInterface.TYPE_INTEGER) ? parseInt(fieldValue) : parseFloat(fieldValue); } ``` *参考Kettle的数值类型判断机制[^3]* #### 步骤5:调试与验证 1. 使用【调试转换】功能验证计算结果 2. 添加【写日志】组件输出中间值 3. 检查空值、非数值字段的过滤情况
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值