kettle Modified Java Script Value获取变量

本文介绍了一种从JavaScript代码中解析变量并将其转换为不同数据类型的方法。通过Rhino JavaScript引擎,文章详细展示了如何获取JavaScript中的变量名称,并判断其对应的Java数据类型,包括整型、浮点型、日期型等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class PramaryBean {
	private String praName;
	private String reName;
	private int valueType;
	private String valueTypeCN;
	private int length;
	private int precision;
	private boolean replaceable;
}
public static List<PramaryBean> getValues(String javascript){
		List<PramaryBean> plist = new ArrayList<PramaryBean>();
		
		Context jscx;
	    Scriptable jsscope;

	    // Making Refresh to get Active Script State
	    String scr = javascript;
	    jscx = ContextFactory.getGlobal().enterContext();
	    jscx.setOptimizationLevel( -1 );
	    jsscope = jscx.initStandardObjects( null, false );
		ScriptOrFnNode tree = parseVariables( jscx, jsscope, scr, "script", 1, null );
		
		for ( int i = 0; i < tree.getParamAndVarCount(); i++ ) {
            String varname = tree.getParamOrVarName( i );
            if ( !varname.equalsIgnoreCase( "row" ) && !varname.equalsIgnoreCase( "trans_Status" ) ) {
              int type = ValueMetaInterface.TYPE_STRING;
              int length = -1, precision = -1;
              Object result = jsscope.get( varname, jsscope );
              if ( result != null ) {
                String classname = result.getClass().getName();
                if ( classname.equalsIgnoreCase( "java.lang.Byte" ) ) {
                  // MAX = 127
                  type = ValueMetaInterface.TYPE_INTEGER;
                  length = 3;
                  precision = 0;
                } else if ( classname.equalsIgnoreCase( "java.lang.Integer" ) ) {
                  // MAX = 2147483647
                  type = ValueMetaInterface.TYPE_INTEGER;
                  length = 9;
                  precision = 0;
                } else if ( classname.equalsIgnoreCase( "java.lang.Long" ) ) {
                  // MAX = 9223372036854775807
                  type = ValueMetaInterface.TYPE_INTEGER;
                  length = 18;
                  precision = 0;
                } else if ( classname.equalsIgnoreCase( "java.lang.Double" ) ) {
                  type = ValueMetaInterface.TYPE_NUMBER;
                  length = 16;
                  precision = 2;

                } else if ( classname.equalsIgnoreCase( "org.mozilla.javascript.NativeDate" )
                  || classname.equalsIgnoreCase( "java.util.Date" ) ) {
                  type = ValueMetaInterface.TYPE_DATE;
                } else if ( classname.equalsIgnoreCase( "java.lang.Boolean" ) ) {
                  type = ValueMetaInterface.TYPE_BOOLEAN;
                }
              }
              PramaryBean p = new PramaryBean();
              p.setPraName(varname);
              p.setReName(varname);
              p.setValueType(type);
              p.setValueTypeCN(ValueMeta.getTypeDesc( type ));
              p.setLength(length);
              p.setPrecision(precision);
              p.setReplaceable(false);
              plist.add(p);
              System.out.println("1:" + varname);
              System.out.println("2:" + "");
              System.out.println("3:" + type);
              System.out.println("3:" + ValueMeta.getTypeDesc( type ));
              System.out.println("4:" + (length >= 0 ? ( "" + length ) : "") );
              System.out.println("5:" + (precision >= 0 ? ( "" + precision ) : "") );
            }
          }
		return plist;
	}


Kettle (Pentaho Data Integration) 中,处理Java代码input step获取并修改变量值通常涉及到JDBC步骤或者自定义的Java transformation(job)中的Scripting step。以下是一个简单的示例,展示了如何通过Java代码从Input Step获取字段值,并对其进行修改: ```java // 导入必要的包 import java.sql.ResultSet; import org.pentaho.di.core.row.RowMetaInterface; import org.pentaho.di.trans.TransMeta; import org.pentaho.di.trans.step.BaseStep; public class MyCustomStep extends BaseStep { private String myField; // 您需要获取的字段名 public Object getInputRowValue(RowMetaInterface rowMeta, Object[] row) throws KettleStepException { ResultSet resultSet = (ResultSet) getInputRowSet().getRow(); // 获取输入数据集 if (resultSet.next()) { this.myField = resultSet.getString(myField); // 读取特定字段值 System.out.println("Original value of " + myField + ": " + this.myField); // 进行修改操作,例如字符串截取、替换等 String modifiedValue = this.myField.substring(0, 5); // 假设我们只取前五个字符 this.myField = modifiedValue; // 更新字段值 System.out.println("Modified value of " + myField + ": " + this.myField); } return null; // 返回null表示处理完成 } @Override public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException { try { getInputRow(); // 调用getInputRowValue处理每一行数据 } catch (Exception e) { logError(e.getMessage(), e); setErrors(1); stopAll(); return false; } return true; } } ``` 在这个例子中,你需要将`myField`替换为你想要操作的具体字段名。然后,这个step会在每次循环中获取输入数据,读取指定字段的值,进行修改,最后返回结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值