Как разделить значение поля в tmap в TALEND

Я только начинаю работать с Talend и хотел бы знать, как разделить значение из файла CSV и округлить его, если это возможно?

Вот моя схема работы:

Схема работы

А вот как настроен мой tMap:

конфигурация tMap


person user3449429    schedule 25.07.2014    source источник
comment
Если вы хотите выполнять арифметические действия, вы должны убедиться, что операнды имеют числовой тип. Вы пытались объявить var1 как целое число или число с плавающей запятой?   -  person Marcus Rickert    schedule 25.07.2014
comment
он говорит, что метод разделить (int) (или разделить (плавать)) не определен для строкового типа.   -  person user3449429    schedule 25.07.2014


Ответы (2)


Я предполагаю, что "/ r" должен добавить новую строку? На самом деле это не сработает и вместо этого добавит строковый литерал «/ r» к любой другой строке, к которой вы его добавляете. Вам также не нужно этого делать, потому что Talend автоматически начнет новую строку в конце строки данных для вашего tFileOutputDelimited.

Но что еще более важно, вы пытаетесь вызвать метод разделения для строки, которая явно не существует (как ее определить?).

Вам нужно сначала проанализировать строку как числовой тип (например, float/double/Big Decimal), а затем разделить на другой числовой тип (ваш Var1 определен как строка в вашем примере, поэтому на самом деле там тоже произойдет сбой, потому что строка должна заключать в кавычки).

Таким образом, обычно вы либо определяете столбец схемы, который вы делите, как числовой тип (как уже упоминалось), либо пытаетесь разобрать строку в число с плавающей запятой в компоненте tMap/tJavaRow.

Если ваши цены определены как что-то вроде двойника перед вашей операцией tMap/tJavaRow, которая делится, вы можете использовать:

row1.prix2 / Var.var1

Или округлить до двух знаков после запятой:

(double)Math.round((row1.prix2 / Var.var1) * 100) / 100

Вы также можете использовать компонент tConvertType для явного преобразования между типами, где это возможно. В качестве альтернативы вы можете проанализировать строку как двойную, используя:

Double.parseDouble(row1.prix2)

А затем продолжайте использовать это, как описано ранее.

Однако в вашем случае (согласно вашему комментарий к ответу Габриэле), есть еще одна проблема в том, что Java (и большинство языков программирования) ожидают, что числа будут отформатированы с . для десятичной точки. Вам нужно добавить шаг предварительной обработки, чтобы иметь возможность анализировать вашу строку как двойную.

Как показывают ответы на этот вопрос, существуют пару вариантов. Вы можете использовать этап обработки регулярных выражений, чтобы изменить все ваши запятые в этом поле на точки, или вы можете использовать tJavaRow, чтобы установить свой язык на французский, когда вы анализируете двойное значение следующим образом:

NumberFormat format = NumberFormat.getInstance(Locale.FRENCH);
Number number = format.parse(input_row.prix2);
double d = number.doubleValue();

output_row.nom = input_row.nom;
output_row.code = input_row.code;
output_row.date = input_row.date;
output_row.ref = input_row.ref;
output_row.ean = input_row.ean;
output_row.quantitie = input_row.quantitie;
output_row.prix1 = input_row.prix1;
output_row.prix2 = d;

И обязательно импортируйте соответствующие библиотеки на вкладке «Дополнительные настройки» компонента tJavaRow:

import java.text.NumberFormat;
import java.util.Locale;

Ваша выходная схема для tJavaRow должна быть такой же, как и входная, но с prix2 двойным значением, а не строкой.

person ydaetskcoR    schedule 25.07.2014
comment
хорошо, спасибо, я попробую это, когда я вернусь на работу во вторник, я дам вам знать - person user3449429; 26.07.2014

Поскольку var1 определяется как String, вы не можете применить метод divide. Попробуйте что-то подобное для вашего исчисления вывода prix2:

(Float.parseFloat(row1.prix2)/2200f) + "Vr"

или что-то в этом роде (я вообще плохо читаю текст на скриншоте)

person Gabriele B    schedule 25.07.2014
comment
ошибка: Exception in component tMap_1 java.lang.NumberFormatException: For input string: "000009000,00" at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source) at java.lang.Float.parseFloat(Unknown Source) at mod_file_02.liban_0_1.liban.tFileInputDelimited_1Process(liban.java:1514) at mod_file_02.liban_0_1.liban.tFileList_1Process(liban.java:550) at mod_file_02.liban_0_1.liban.runJobInTOS(liban.java:2172) at mod_file_02.liban_0_1.liban.main(liban.java:2020) - person user3449429; 25.07.2014
comment
Вероятно, это вызвано запятой. См. stackoverflow.com/questions/7571553/. - person Marcus Rickert; 25.07.2014