Я только начинаю работать с Talend и хотел бы знать, как разделить значение из файла CSV и округлить его, если это возможно?
Вот моя схема работы:
А вот как настроен мой tMap:
Я только начинаю работать с Talend и хотел бы знать, как разделить значение из файла CSV и округлить его, если это возможно?
Вот моя схема работы:
А вот как настроен мой tMap:
Я предполагаю, что "/ 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
двойным значением, а не строкой.
Поскольку var1
определяется как String, вы не можете применить метод divide
. Попробуйте что-то подобное для вашего исчисления вывода prix2:
(Float.parseFloat(row1.prix2)/2200f) + "Vr"
или что-то в этом роде (я вообще плохо читаю текст на скриншоте)
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
var1
как целое число или число с плавающей запятой? - person Marcus Rickert   schedule 25.07.2014