描述
这是“ JavaScript值 ”步骤的修改版本,可提供更好的性能和更轻松的基于表达式的用户界面,以构建JavaScript表达式。此步骤还允许您为每个步骤创建多个脚本。
另请参阅“将JavaScript从2.5.x迁移到3.0.0 ”以获取更多内部细节。
您本地的“ data-integration / samples / transformations”文件夹中也有很多示例。
请记住,由于该步骤正在解释JavaScript,因此在性能上存在劣势。如果性能对您至关重要,请参阅“脚本”部分中的其他步骤。
Java脚本功能
本节提供了可用脚本,函数,输入字段和输出字段的树状视图。
- 转换脚本:显示在此步骤中创建的脚本列表
- 转换常数:一组预定义的静态常数,包括SKIP_TRANSFORMATION,ERROR_TRANSFORMATION和CONTINUE_TRANSFORMATION
- 转换函数:包含各种字符串,数字,日期,逻辑和专用函数,可用于创建脚本。要将功能添加到脚本中,只需双击该功能或将其拖动到脚本中要插入的位置。
- 输入字段:进入步骤的输入列表。双击或使用拖放将字段插入脚本。
- 输出字段:步骤的输出列表。
Java脚本
在此部分中,您可以编辑此步骤的脚本。您可以通过双击要插入的节点或将对象拖到Java脚本面板上,从左侧的树控件中插入函数,常量,输入字段等。
字段
字段表包含脚本变量的列表,包括添加元数据(如描述性名称)的功能。
附加功能
- 获取变量 按钮 -从脚本中检索变量列表。
- 测试脚本 按钮 -使用此按钮可以测试脚本的语法。
Java脚本内部API对象
您可以使用以下内部API对象(供参考,请参见源代码中的类):
- TransformationName:具有实际转换名称的字符串
- step: org.pentaho.di.trans.steps.scriptvalues_mod.ScriptValuesMod的实际步骤实例
- rowMeta: org.pentaho.di.core.row.RowMeta的实际实例
- row:实际数据Object []的实际实例
常见问题
兼容性开关有什么作用?
javascript引擎有两个版本:2.5版本和3版本。如果选中了“兼容模式”(默认情况下为“兼容模式”),则javascript的工作方式与2.5版相同。显然,应尽可能使用新版本,因此,如果可以的话,请取消选中“兼容模式”。
这两个版本之间的最大区别是,在2.5中,值对象可以直接修改,并且它们的类型可以更改(日期变量可以转换为字符串)。这可能会导致细微的错误(有关更多详细信息,请参见迁移2.5-> 3.0文档)。由于在3.0版本中不再可能,因此javascript也应该更快。
有关更多详细信息,请阅读迁移2.5-> 3.0 doc。
如何检查行中字段的存在(启用兼容性)?
以下代码段(使用兼容功能打开)可让您进行检查。但是请记住,您不能在PDI中混合行,流经单个跃点的所有行必须具有相同数量的字段,并且它们必须具有相同的名称和类型。
片段:
var idx = row.searchValueIndex("lookup");
if ( idx < 0 )
{
var lookupValue = 0;
}
else
{
var lookupValue = row.getValue(idx);
}
没有兼容性的相同代码段已打开:
var idx = getInputRowMeta().indexOfValue("lookup");
if ( idx < 0 )
{
var lookupValue = 0;
}
else
{
var lookupValue = row[idx];
}
如何连续添加新字段
预先注意,将字段添加到行中的顺序很重要。始终以相同的顺序添加字段以保持行的结构连贯。
现在添加一个字段:
在源代码中将其定义为“ var”,并将其添加为JavaScript对话框下半部分的fields表中的字段。
如何修改值(关闭兼容性)
在3.0及更高版本中,更改输入值(以及可能更改其类型)的首选方法是创建一个新变量,并使用主要javascript文本区域下方的“字段”列表将其输出。然后在单独的“选择值”步骤中,用新变量替换旧变量。尽管它比2.5中的样式略差,但是代码应该更快,更安全。
或者(可以在4.1.0-GA之后改进错误报告),可以使用“替换值’Fieldname’或’Rename To’”字段。如果是,则使用“重命名为”字段(或者如果为空白,则使用“字段名”字段)来查找现有字段并替换其值和元数据类型。如果输入流中不存在指定的字段,则将错误传递到下一步,指示找不到要替换的字段。
如何修改值(启用兼容性)
启用兼容性后,按如下所示在输入字段上使用setValue(假设field1是输入行中的字段):
field1.setValue(100);
setValue()接受可以在PDI中使用的所有可能的类型(还包括String,Dates等)。
如何在JavaScript中使用类似NVL的内容?
启用兼容性开关后,可以使用以下构造(获得类似nvl(a,‘0’)的东西):
var a;
if ( fieldname.isNull() )
{
a = '0';
}
else
{
a = fieldName.getString();
}
您还可以使用:
fieldName.nvl('1');
如果fieldName为null,则它将用’1’的值替换fieldName的值。
如何分割字段
在一个字段中,我有包含数字和字符的商家代码,例如。“ 12345McDonalds”。我想拆分它,但是该字段没有一致的布局,我想拆分第二部分中的数字第一部分。
使用以下一段JavaScript,Merchant_Code是输入字段的名称
var str = Merchant_Code.getString();
var code = "";
var name = "";
for (i = 0; i < str.length(); i++ )
{
c = str.charAt(i);
if ( ! java.lang.Character.isDigit(c) )
{
code = str.substring(0, i);
name = str.substring(i);
Alert("code="+code+", name="+name);
break;
}
}
Alert()仅用于显示字段。在外部for循环之后,您可以在新的单独字段中添加代码和名称,例如
比较值
来自数据行的所有值都是Java对象,因此无法对带有“ =”,“>”,“ <”等的值进行比较。
您需要使用特定于Java对象的比较方法(请参见下面的示例)。
比较字符串值
确保使用以下构造:
string.equals(otherString)
确保不要对字符串使用==运算符
如果要忽略大小写差异,也可以使用以下方法:
string.equalsIgnoreCase(otherString)
比较数值
默认情况下,即使您认为分配了整数,JavaScript中分配的大多数值都是浮点值。
无论是什么情况,如果您在使用==或在已知本质上为整数的值上切换/大小写时遇到麻烦,请使用以下构造:
parseInt(num)==parseInt(num2)
或者
switch(parseInt(valuename))
{
case 1:
case 2:
case 3:
strvalueswitch = "one, two, three";
break;
case 4:
strvalueswitch = "four";
break;
default:
strvalueswitch = "five";
}
筛选行
如果要过滤行,即从输出中删除行,则可以设置trans_Status变量:
trans_Status = CONTINUE_TRANSFORMATION
if (/* add your condition here */) trans_Status = SKIP_TRANSFORMATION
从输出中删除所有符合条件的行。
参考
https://wiki.pentaho.com/display/EAI/Modified+Java+Script+Value