水壶 - 用逗号作为十进制标记读取CSV

时间:2015-06-03 13:05:36

标签: linux pentaho business-intelligence kettle pdi

我对Pentaho Data Integration(aka Kettle)进行了转换,我做的第一件事是使用“CSV输入”来映射我的平面文件。

我从来没有遇到过关于Windows的这一步的问题,但现在我正在操作服务器,其中勺子将运行到Linux服务器,现在我遇到解析问题(将String转换为Integer)。

简而言之,转型的作用是:

CSV输入:用于映射我的CSV中的所有字段。我使用ISO-8859-1编码。

过滤行用于获取某些特定行。

脚本值/ Mod:用于更改某些字段的某些值。

现在,导致问题的步骤:

选择/重命名值:用于将标题重命名为我的表列,以便我可以在表格中插入数据。它在每个标签上有什么作用?

选择& Alter(tab)* null字段省略

字段名 重命名为
Código codigo_cliente

元数据(制表符)*省略空字段

字段名 重命名为 输入 二进制到普通 数据格式宽容? 宽频号码转换?
Código codigo_cliente 整数 名词 名词 名词

我得到的错误是:

2015/06/03 09:49:10 - Select values.0 - ERROR (version 5.3.0.0-213, build 1 from 2015-02-02_12-17-08 by buildguy) : Unexpected error
2015/06/03 09:49:10 - Select values.0 - ERROR (version 5.3.0.0-213, build 1 from 2015-02-02_12-17-08 by buildguy) : org.pentaho.di.core.exception.KettleValueException: 
2015/06/03 09:49:10 - Select values.0 - Unexpected conversion error while converting value [codigo_cliente String<binary-string>] to an Integer
2015/06/03 09:49:10 - Select values.0 - 
2015/06/03 09:49:10 - Select values.0 - codigo_cliente String<binary-string> : couldn't convert String to Integer
2015/06/03 09:49:10 - Select values.0 - 
2015/06/03 09:49:10 - Select values.0 - codigo_cliente String<binary-string> : couldn't convert String to number : non-numeric character found at position 7 for value [21.237,00]
2015/06/03 09:49:10 - Select values.0 - 
2015/06/03 09:49:10 - Select values.0 - 
2015/06/03 09:49:10 - Select values.0 - 
2015/06/03 09:49:10 - Select values.0 -     at org.pentaho.di.core.row.value.ValueMetaBase.getInteger(ValueMetaBase.java:1780)
2015/06/03 09:49:10 - Select values.0 -     at org.pentaho.di.core.row.value.ValueMetaBase.convertData(ValueMetaBase.java:3537)
2015/06/03 09:49:10 - Select values.0 -     at org.pentaho.di.trans.steps.selectvalues.SelectValues.metadataValues(SelectValues.java:326)
2015/06/03 09:49:10 - Select values.0 -     at org.pentaho.di.trans.steps.selectvalues.SelectValues.processRow(SelectValues.java:375)
2015/06/03 09:49:10 - Select values.0 -     at org.pentaho.di.trans.step.RunThread.run(RunThread.java:62)
2015/06/03 09:49:10 - Select values.0 -     at java.lang.Thread.run(Thread.java:744)
2015/06/03 09:49:10 - Select values.0 - Caused by: org.pentaho.di.core.exception.KettleValueException: 
2015/06/03 09:49:10 - Select values.0 - codigo_cliente String<binary-string> : couldn't convert String to Integer
2015/06/03 09:49:10 - Select values.0 - 
2015/06/03 09:49:10 - Select values.0 - codigo_cliente String<binary-string> : couldn't convert String to number : non-numeric character found at position 7 for value [21.237,00]
2015/06/03 09:49:10 - Select values.0 - 
2015/06/03 09:49:10 - Select values.0 - 
2015/06/03 09:49:10 - Select values.0 -     at org.pentaho.di.core.row.value.ValueMetaBase.convertStringToInteger(ValueMetaBase.java:1036)
2015/06/03 09:49:10 - Select values.0 -     at org.pentaho.di.core.row.value.ValueMetaBase.getInteger(ValueMetaBase.java:1720)
2015/06/03 09:49:10 - Select values.0 -     ... 5 more
2015/06/03 09:49:10 - Select values.0 - Caused by: org.pentaho.di.core.exception.KettleValueException: 
2015/06/03 09:49:10 - Select values.0 - codigo_cliente String<binary-string> : couldn't convert String to number : non-numeric character found at position 7 for value [21.237,00]
2015/06/03 09:49:10 - Select values.0 - 
2015/06/03 09:49:10 - Select values.0 -     at org.pentaho.di.core.row.value.ValueMetaBase.convertStringToInteger(ValueMetaBase.java:1028)
2015/06/03 09:49:10 - Select values.0 -     ... 6 more

问题发生的原因是,在此字段中,我在CSV文件中使用逗号作为我的小数点。

这就是我的CSV文件的样子:

我的CSV文件标题:

Ano;Mês;Diretoria;Tipo;Tipo de macrorubrica;Macrorubrica;Conta contábil;Código;Cliente;OS;Descrição;Fornecedor;Documento;Tipo documento;Nota;Atividade;Tipo atividade;Descrição;UA;Valor;Orçado

其中一行:

2015;4;CERT;Custo Apropriado;CUSTO SERVIÇO PRESTADO;PESSOAL;14520 .201;87.979,00;SOF HAR;00077864;SQ 36525;FUNDACAO ABCD;1383;FP;;1048;.;.;2030;1.076,35;,00

如果更容易看到,我在此行中名为“Código”(稍后将在“选择值”步骤中成为“codigo_cliente”)的列的值为 87.979,00

在不更改CSV文件的情况下解决此问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

我找到了the answer in two forums。我必须在Select Values步骤中设置一些字段,以便它能理解我的格式:

格式 十进制 组合
#,###。##

如果有人能想到更好的东西,请在此处分享: - )

答案 1 :(得分:1)

正如@LeonardoSibela所建议和自我回答的那样,问题在于格式化。

理想情况下,除了两台机器之间的某些JVM特定行为(例如类加载)之外,应该没有显着差异。

那么真正的不同之处是什么?系统&#39; 区域设置

例如,如果您的Linux服务器设置为知道#,###.##的区域设置,但数据源于具有知道#.###,##的区域设置的系统,则您有(可解决的)问题。

正如您在自己的回答中所提到的,您必须让流程知道数据的投放格式。

即:

  • 格式#.###,##
  • 十进制,
  • 分组.