我刚刚开始使用Talend,我想知道如何从CSV文件中分割值并在可能的情况下将其四舍五入吗?
这是我的工作布局:
这是我的tMap的配置方式:
最佳答案
我假设“ / r”是要添加新行?那实际上将不起作用,而是将字符串文字“ / r”添加到您要添加到其上的任何其他字符串。您也不需要这样做,因为Talend会在tFileOutputDelimited的数据行的末尾自动开始新行。
但更重要的是,您试图在显然不存在的字符串上调用除法(如何定义它?)。
您需要先将字符串解析为数字类型(例如float / double / Big Decimal),然后再除以其他数字类型(您的Var1在示例中被定义为字符串,因此实际上也会失败,因为字符串必须包含在引号中)。
因此,通常您可以将要划分的模式列定义为数字类型(如上所述),或者尝试将字符串解析为tMap / tJavaRow组件中的float。
如果在将tMap / tJavaRow操作除以价格之前将价格定义为类似两倍的价格,则可以使用:
row1.prix2 / Var.var1
或将其舍入到小数点后两位:
(double)Math.round((row1.prix2 / Var.var1) * 100) / 100
您还可以使用tConvertType组件在可用的类型之间进行显式转换。或者,您可以使用以下方式将字符串解析为双精度型:
Double.parseDouble(row1.prix2)
然后如前所述继续使用它。
但是,在您的情况下(根据Gabriele的回答comment),Java(和大多数编程语言)还存在一个问题,希望数字以小数点的
.
格式表示。您需要添加一个预处理步骤,才能将您的字符串解析为双精度型。如this question的答案所示,有两种选择。您可以使用正则表达式处理步骤将该字段中的所有逗号都更改为句点,也可以使用tJavaRow将您的语言环境设置为法语,因为您在解析double时会像这样:
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
是双精度而不是字符串。关于java - 如何在TALEND中的tmap中划分字段的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24957396/