我刚刚开始使用Talend,我想知道如何从CSV文件中划分值并尽可能将其舍入?
这是我的工作布局:
以下是我的tMap的配置方式:
答案 0 :(得分:1)
由于var1
被定义为String,因此无法应用divide
方法。尝试这样的输出prix2演算:
(Float.parseFloat(row1.prix2)/2200f) + "Vr"
或类似的东西(实际上我无法很好地阅读截图中的文字)
答案 1 :(得分:1)
我假设" / r"是添加一个新行吗?这实际上不会起作用,而是会添加一个字符串文字" / r"到你要添加的任何其他字符串。您也不需要这样做,因为Talend会自动在您的tFileOutputDelimited数据行的末尾开始一个新行。
但更重要的是,你试图在显然不存在的字符串上调用divide方法(如何定义?)。
您需要首先将字符串解析为数字类型(例如float / double / Big Decimal),然后除以另一个数字类型(您的Var1在您的示例中定义为字符串,因此实际上也会失败,因为一个字符串必须包含在引号中。
通常,您要么将要划分的架构列定义为数字类型(如上所述),要么尝试将字符串解析为tMap / tJavaRow组件中的float。
如果在tMap / tJavaRow操作之前将价格定义为double之类,则可以使用:
row1.prix2 / Var.var1
或者将它四舍五入到小数点后两位:
(double)Math.round((row1.prix2 / Var.var1) * 100) / 100
您还可以使用tConvertType组件在可用的类型之间显式转换。或者,您可以使用以下方法将字符串解析为double:
Double.parseDouble(row1.prix2)
然后如前所述继续使用它。
在你的情况下(根据你对Gabriele的答案的comment),还有一个问题是Java(和大多数编程语言)期望用{{1}格式化数字小数点。您需要添加一个预处理步骤,以便能够将字符串解析为double。
正如this question的答案所示,有几种选择。您可以使用正则表达式处理步骤将该字段中的所有逗号更改为句点,或者您可以使用tJavaRow将语言环境设置为法语,因为您解析双精度语句,如下所示:
.
并确保在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;
是双精度而不是字符串。