#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 . Мы устанавливаем разделитель на:
"\|"
И, наконец, мы используем выходные данные так, как нам нужно.