2013-04-05 152 views
4

我在Talend做了一個數據遷移項目,我需要處理一個包含許多列的大表格,並將(舊)數據映射到新模型的不同值。
我有一個獨特的三列映射表。
Talend內部變量

例子:

Column name | Value old | Value new 
     "col 1"   1   3 
     "col 1"   3   2 
     "col 2"   10   7 
     etc 

這樣我可以參考使用「列名」,以與我需要映射列中的值。

使用舊值作爲使用「列名」的映射表中的查找:當舊值匹配時,則返回新值。

我可以爲每列手動執行此操作,但有數百個,這意味着每列至少有一個哈希值重複。

我難以理解如何更簡單地做到這一點,並且對於原始表中的每個可能的列只有一次。

現在我正在做一個巨大的tMap,並使用大量的查找:每列一個。

任何想法表示讚賞。

-

一些額外的想法,我有:
1)有沒有什麼辦法知道鏈路連接兩個設備的名稱?我可以更容易地重複使用tMap上的同一連接和過濾器

+2

將您的解決方案作爲答案比編輯問題更好。 SO允許人們回答他們自己的問題。 – 2013-10-23 09:19:06

+0

完成了,花了我足夠長的時間:) – 2014-03-13 17:02:48

回答

1

我可以使用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 ""; 
     } 
    }