Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 动态表达式实现_Java_Informatica_Informatica Powercenter - Fatal编程技术网

Java 动态表达式实现

Java 动态表达式实现,java,informatica,informatica-powercenter,Java,Informatica,Informatica Powercenter,我有一个源表,如下所示: S1 S2 S3 S4 你好,这里是SSN1,SSN2 其中S1、S2、S3和S4是列名。 同样,还有一个目标表,它有三个字段: T1 T2 T3 我还有一张表,如下所示: 函数目标列 concatS1,S2,T1 子序列3,1,3 T2 子序列3,3,1 T3 我希望有这样一个映射,它可以获取函数名,并根据表中的函数映射到指定的目标列。运行映射后,我现在的目标表将是: T1 T2 T3 迄今为止SSN 1 我怎样才能做到这一点? 我尝试过使用一个查找函数列,它在输出中

我有一个源表,如下所示: S1 S2 S3 S4 你好,这里是SSN1,SSN2 其中S1、S2、S3和S4是列名。 同样,还有一个目标表,它有三个字段: T1 T2 T3 我还有一张表,如下所示: 函数目标列 concatS1,S2,T1 子序列3,1,3 T2 子序列3,3,1 T3 我希望有这样一个映射,它可以获取函数名,并根据表中的函数映射到指定的目标列。运行映射后,我现在的目标表将是: T1 T2 T3 迄今为止SSN 1

我怎样才能做到这一点?
我尝试过使用一个查找函数列,它在输出中有一列,包含所有函数的连接字符串和目标表名。因此,我的查找输出如下所示: concatS1,S2,T1::substrS3,1,3,T2::substrS3,3,1,T3

然后,我将其与源端口s1s2 S3 S4一起传递给一个java转换进程。我不知道现在该怎么办。 我试着使用invokejb表达式。 我用::作为分隔符拆分字符串,并将其存储在数组arr1中。 所以我有 arr1[0]=concatS1、S2、T1 arr1[1]=子序列3,1,3,T2 arr1[2]=子序列3,3,1,T3 现在,我运行这个trhough循环,并再次使用,作为分隔符拆分它,并存储到arr2中。 所以我的arr1[0]的arr2是这样的: arr2[0]=concatS1,S2 arr2[1]=T1

现在,如果我使用InvokeJExpression,我将把它的结果赋给什么?
我希望我的表达式concatS1,S2被处理并映射到T1,现在它位于arr2[1]中。这就是我被卡住的地方。

看起来您可以在Java转换中使用Java API函数invokeJExpression来派生目标列

(datatype)invokeJExpression(
                  String expression, 
                  Object[] paramMetadataArray);
我想最困难的部分是从查找中解析连接的字符串,以获得两个参数表达式和paramMeradataArray

表达式和paramMeradataArray应如下所示:

"concat(X1,X2)", [S1, S2]
"substr(X1,X2,X3)", [S1, 1, 3]
请注意,必须以X开始参数并连续编号

更新:

假设从查找中获得端口lkp='concatS1,S2~T1::substrS3,1,3~T2::substrS3,3,1~T3',可以在Java转换中尝试以下代码。但是,此代码可能不适用于所有函数。例如,传递十进制值将不起作用

导入包:

在输入行上:


我不确定我是否正确理解了这个问题。但是,如果源列和目标列将保持不变,但每次运行时表达式可能会更改,则可以尝试使用选中“Is expression”的参数。参数值将是您的实际函数,无论您在哪里使用它,它都将在表达式转换中进行计算。

请在下面找到最简单的方法,如果您有进一步的问题,请告诉我

1.Create 3 mapping parameters as $$Map1 , $$Map2 & $$Map3 with any default value.

2.Better to create a Job_Parameter table to store parameter and its corresponding value like :

Workflow Name | Parameter Name | Parameter value
wf_abc | $$Map1 | default
wf_abc | $$Map2 | default
wf_abc | $$Map3 | default

3. Create a mapping / unix script / SQL procedure to read your functions and keep those in to this Job_Parameter table, your table should look like this.
(Job_Parameter is always truncate and load).

Workflow Name | Parameter Name | Parameter value
wf_abc | $$Map1 | concat(S1,S2) 
wf_abc | $$Map1 | substr(S3,1,3)
wf_abc | $$Map1 | substr(S3,3,1)

4. Create a parameter file using this Job_Parameter table and it should look like this:

[Global]
wf_abc
 $$Map1=concat(S1,S2) 
 $$Map1=substr(S3,1,3)
 $$Map1=substr(S3,3,1)

4. Go to you Actual mapping and read the source with 4 columns, 
 create 3 variable ports next to SQ 
V1= $$Map1
V2= $$Map2
V3= $$Map3 ..Create 3 output ports and assign these variable ports accordingly.
Source-SQualifier-Expression-Target
将输出端口链接到目标


我希望您在functions source中收到的所有文件名和在Informatica中命名的文件名都是相同的,如果不进行相应的更改。

假设到表的连接没有问题,您应该对Function列执行一些字符串操作。函数名和参数是否已知?如果是这样,查找表可能是解决方案。到目前为止你尝试了什么?我想你也可以摆脱查找表。。。只需要正确地排列数据并对函数字符串进行一点操作即可获得函数和参数。请澄清:表是否在数据库中?是的。我使用的是Oracle 11g数据库。我尝试过使用函数列的查找,该列的输出中将有一列,其中包含所有函数的串联字符串和目标表名。所以我的查找输出是这样的:concatS1,S2,T1::substrS3,1,3,T2::concatS3,3,1,T3,然后我将其与源端口S1,S2,S3,S4一起传递给java转换来处理。现在不知道如何继续。谢谢你的回复。我试着使用invokejb表达式。我用::作为分隔符拆分字符串,并将其存储在数组arr1中。所以我有arr1[0]=concatS1,S2,T1 arr1[1]=substrS3,1,3,T2 arr1[2]=substrS3,3,1,T3现在我运行这个trhough循环,再次使用,作为分隔符拆分它,并存储到arr2中。所以我的arr1[0]的arr2是这样的:arr2[0]=concatS1,S2 arr2[1]=T1现在如果我使用InvokeJExpression,我将把结果分配给什么?我希望我的表达式concatS1,S2被处理并映射到T1,现在它位于arr2[1]中。这就是我被卡住的地方。如果使用逗号分割,它将不起作用,因为参数也是用逗号分隔的。我已经用一个示例代码更新了答案。让我知道它是否有效
String[] arr1 = lkp.split("::");

for (int i = 0; i < arr1.length; i++) {
    String[] arr2 = arr1[i].split("~");
    Pattern pattern = Pattern.compile("\\((.*?)\\)");
    Matcher matcher = pattern.matcher(arr2[0]);
    String params = "";
    if (matcher.find()) {
        params = matcher.group(1);
    }
    String[] param = params.split(",");
    Object[] args1 = new Object[param.length];
    String params1 = "";
    for (int j = 0; j < param.length; j++) {
        int index = j + 1;
        Object arg = new Object();
        params1 = params1 + (!params1.equals("") ? "," : "") + "X"
                + index;
        if (param[j].equals("S1"))
            arg = S1;
        else if (param[j].equals("S2"))
            arg = S2;
        else if (param[j].equals("S3"))
            arg = S3;
        else if (param[j].equals("S4"))
            arg = S4;
        else if (!param[j].startsWith("\'"))
            arg = Integer.parseInt(param[j]);
        else
            arg = param[j];
        args1[j] = arg;
    }

    String exp = matcher.replaceAll("(" + params1 + ")");
    if (arr2[1].equals("T1"))
        T1 = (String) invokeJExpression(exp, args1);
    else if (arr2[1].equals("T2"))
        T2 = (String) invokeJExpression(exp, args1);
    else if (arr2[1].equals("T3"))
        T3 = (String) invokeJExpression(exp, args1);

}
1.Create 3 mapping parameters as $$Map1 , $$Map2 & $$Map3 with any default value.

2.Better to create a Job_Parameter table to store parameter and its corresponding value like :

Workflow Name | Parameter Name | Parameter value
wf_abc | $$Map1 | default
wf_abc | $$Map2 | default
wf_abc | $$Map3 | default

3. Create a mapping / unix script / SQL procedure to read your functions and keep those in to this Job_Parameter table, your table should look like this.
(Job_Parameter is always truncate and load).

Workflow Name | Parameter Name | Parameter value
wf_abc | $$Map1 | concat(S1,S2) 
wf_abc | $$Map1 | substr(S3,1,3)
wf_abc | $$Map1 | substr(S3,3,1)

4. Create a parameter file using this Job_Parameter table and it should look like this:

[Global]
wf_abc
 $$Map1=concat(S1,S2) 
 $$Map1=substr(S3,1,3)
 $$Map1=substr(S3,3,1)

4. Go to you Actual mapping and read the source with 4 columns, 
 create 3 variable ports next to SQ 
V1= $$Map1
V2= $$Map2
V3= $$Map3 ..Create 3 output ports and assign these variable ports accordingly.
Source-SQualifier-Expression-Target