Talend — от одной строки ко многим, переменное количество выходных строк

#java #talend

#java #талант #talend

Вопрос:

Справочная информация: В Talend принято использовать что-то вроде tSplitRow для сопоставления одной строки с большим количеством полей в несколько строк. Строка с полями:

Date | Name | MorningPhone | Day Phone | EveningPhone … может быть разделен на:

Date | Name | Phone … и у вас всегда будет 3 результирующих строки из одной строки.


Вопрос: Что, если мне нужно количество строк из переменного количества полей?

У меня есть схема: UniqueID | FieldSet где FieldSet — это разделенное поле столбцов, кратное девяти. Если в этом столбце с разделителями есть 45 полей, мне нужно 5 строк. 81 поле => 9 строк.

Я пытаюсь использовать tJavaRow для анализа полей, но я не знаю, как объединить это с tSplitRow для генерации соответствующего количества полей.

Идеи? Спасибо!

Ответ №1:

Я использовал пользовательский tJavaRow — это превратило специально отформатированную строку в новую таблицу. Своего рода взлом, но это сработало.

 String input = "";
String OUT = "";


try {
      input = java.net.URLDecoder.decode(input_row.CustomField16, "ASCII");

} catch (UnsupportedEncodingException e) {
      e.printStackTrace();
}

String[] pieces = input.split(";");

/*for(int a=0; a<pieces.length; a  )
      System.out.println("Piece " a "n" pieces[a]);*/



String[] allfields = pieces[0].split("\|");

//System.out.println("num_full_rows=" num_full_rows);


int fieldnum=9;
int totalrows=1;
for (int i=0; i 8<allfields.length; i  ) {

      String xrow = allfields[i];
      i  ;
      for (int j=i; j<fieldnum*totalrows;j  ){
            xrow=xrow "t" allfields[j];
      }
      i =fieldnum-2;

      totalrows  ;
      OUT  = (input_row.LoadTime   "t"
                    input_row.minutepart   "t"   input_row.TXID
                    "t"   input_row.SessionString   "t"   xrow   "n");


}

output_row.BULK = OUT;
  

Комментарии:

1. Не могу придумать лучшего способа сделать это.

2. Этот метод устарел. Пожалуйста, смотрите мой ответ ниже

Ответ №2:

Talend развивался с тех пор, как был задан этот вопрос, и гораздо лучший способ сделать это — использовать компонент tNormalize .

введите описание изображения здесь

Сначала мы используем такой файл в качестве входных данных:

 pepe|123|123
juan|454|2423|34343|5454
  

Мы читаем этот файл с помощью компонента tFileInputRegex . Мы должны определить регулярное выражение и схему. Регулярное выражение будет:

 "^([^|] )\|(. )"
  

Схема будет:

введите описание изображения здесь

Затем мы подключаем tFileInputRegex с помощью tNormalize . Мы устанавливаем разделитель на:

 "\|"
  

И, наконец, мы используем выходные данные так, как нам нужно.