2013-04-05 4 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 позволяет людям отвечать на свой вопрос. –

+0

сделал, взял меня достаточно долго :) –

ответ

1

Я мог бы решить его с помощью tMemorizeRows, сохранив всю таблицу отображения в памяти с помощью tJavaFlex, а затем прочитав их с помощью процедуры.

Что я сделал, запомнил всю таблицу, у меня была только одна таблица с тремя столбцами, первая из которых указывала тип отображения, который я должен был сделать, второй - исходный код, а третий - замена код.

После запоминания данных я использовал tJavaFlex для создания трех списков, по одному для каждого столбца, а затем переместите эти списки на карту глобальных переменных.

Затем я создал процедуру, которая получает все три списка плюс два кода, первый из которых - это имя сопоставления (фильтр первого столбца), а второй - исходный код (фильтр второй колонки). Используя оба варианта, я мог бы определить положение кода замены и вернуть его.

Наконец, при чтении основного потока данных, используя tMap, я создал переменную для каждого отдельного значения первого столбца (то есть по одному для каждого типа отображения), а затем вызвал подпрограмму i, разработанную с использованием oriinal code + имя отображения.

Код я использовал в tMemorizeRows было:

СТАРТ КОД

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); 

РЕГЛАМЕНТНОЕ КОД

/* 
* 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 ""; 
     } 
    }