Talend内部变量
问题描述:
我在Talend做了一个数据迁移项目,我需要处理一个包含许多列的大表格,并将(旧)数据映射到新模型的不同值。
我有一个独特的三列映射表。
Talend内部变量
例子:
Column name | Value old | Value new
"col 1" 1 3
"col 1" 3 2
"col 2" 10 7
etc
这样我可以参考使用“列名”,以与我需要映射列中的值。
使用旧值作为使用“列名”的映射表中的查找:当旧值匹配时,则返回新值。
我可以为每列手动执行此操作,但有数百个,这意味着每列至少有一个哈希值重复。
我难以理解如何更简单地做到这一点,并且对于原始表中的每个可能的列只有一次。
现在我正在做一个巨大的tMap,并使用大量的查找:每列一个。
任何想法表示赞赏。
-
一些额外的想法,我有:
1)有没有什么办法知道链路连接两个设备的名称?我可以更容易地重复使用tMap上的同一连接和过滤器
答
我可以使用tMemorizeRows解决它,使用tJavaFlex将整个映射表保存到内存中,然后使用例程读取它们。
我所做的是,记住整个表格,我只有一个表格,有三列,第一个表示我必须做的映射类型,第二个表示原始代码,第三个表示替换码。
一旦记住数据,我使用tJavaFlex创建三个列表,每列一列,然后将这些列表移动到全局变量映射。
然后,我创建了一个例程,接收所有三个列表加上两个代码,第一个是映射名称(第一列过滤器),第二个是原始代码(第二列过滤器)。使用这两个我可以精确定位替换代码的位置,并返回它。
最后,在读取数据主流时,使用tMap,我为第一列的每个不同值创建了一个变量(即每种映射类型都有一个变量),然后调用我使用oriinal代码+映射名称。
i。在tMemorizeRows使用的代码是:
START CODE
java.util.Set<String> iLista;
java.util.List<String> lLOV=new java.util.ArrayList<String>();
java.util.List<String> lS6=new java.util.ArrayList<String>();
java.util.List<String> lS8=new java.util.ArrayList<String>();
主代码
lLOV.add(LOV_tMemorizeRows_1[icount]);
lS6.add(S6_NAME_tMemorizeRows_1[icount]);
lS8.add(S8_NAME_tMemorizeRows_1[icount]);
结束码
globalMap.put("lLOV",lLOV);
globalMap.put("lS6",lS6);
globalMap.put("lS8",lS8);
ROUTINE CODE
/*
* Toma los valores generados de la LOV y matchea con S8, requiere la ejecucion del job
* Genericos\GeneradorLOV
*
* {talendTypes} String | String
*
* {Category} MigracionDatos
*
* {param} string(entrada.LOV) Identifica el tipo de LOV
*
* {param} string(entrada.S6_NAME) Indica el valor del campo en Siebel 6
*
* {param} ((java.util.List<String>) globalMap.get("lLOV"))
*
* {param} ((java.util.List<String>) globalMap.get("lS6"))
*
* {param} ((java.util.List<String>) globalMap.get("lS8"))
*
*/
public static String calculaLOV(String CampoLOV, String CampoS6, java.util.List<String> listaLOV, java.util.List<String> listaS6,java.util.List<String> listaS8 ) {
/*
* java.util.List<String> listaLOV = (java.util.List<String>) globalMap.get("lLOV");
* java.util.List<String> listaS6 = (java.util.List<String>) globalMap.get("lS6");
* java.util.List<String> listaS8 = (java.util.List<String>) globalMap.get("lS8");
*/
String C1 = CampoLOV;
String C2 = CampoS6;
int posicionC1 = listaLOV.indexOf(C1);
// encontró el LOV
if(posicionC1 >= 0) {
java.util.List<String> listaS6_Iterada = new java.util.ArrayList<String>();
// Genera la lista intermedia con los valores
for (int contador = posicionC1; contador < listaLOV.size() ; contador++) {
listaS6_Iterada.add(listaS6.get(contador));
if(!listaLOV.get(contador).toString().equals(C1)) {break;}
}
int posicionC2 = listaS6_Iterada.indexOf(C2);
if(posicionC2 >= 0) {
int posicionFinal = posicionC1 + posicionC2;
return listaS8.get(posicionFinal);
} else {
return "";
}
} else {
return "";
}
}
将您的解决方案作为答案比编辑问题更好。 SO允许人们回答他们自己的问题。 – 2013-10-23 09:19:06
完成了,花了我足够长的时间:) – 2014-03-13 17:02:48