Camel-bindy:如何在编组CSV时转义双引号?

时间:2016-09-16 09:58:35

标签: java csv apache-camel

我试图在CSV字段内容中转义双引号。这是必需的,因为双引号字符已用于包含字段。 但我不知道如何用Camel / Camel-bindy做到这一点(逃脱)。

我想要制作的内容(注意字段内容中的双引号是如何通过加倍来转义的):

  

"一些";"人";"从不""完成""";&#34 ;它们的"

我实际制作的内容(这不会解析为CSV):

  

"一些";"人";"永远不会"完成"";"他们的"

所以,

  • 我是否可以添加任何选项以告诉Camel在(所有)CSV字段值中转义引号?
  • 否则,是否有其他可用于获得相同结果的解决方案?

到目前为止,以下是我所做的事情的状态: 我的Camel版本是2.15。 我使用POJO,后来通过bindy编组为CSV。

这就是POJO的样子

@CsvRecord(separator = ";", crlf = "UNIX", generateHeaderColumns = true, quote = "\"", quoting = true)
public class MyCsvPOJO
{
    @DataField(pos = 1)
    private String prop1 = ""; 

    // Some other properties + getters + setters
}

这是生成CSV文件的camel路由代码(使用Camel Java DSL):

from("myRouteId")
    .beanRef("myPojoProducerBean")
    .marshal()
    .bindy(BindyType.Csv, MyCsvPOJO.class)
    .convertBodyTo(String.class, "UTF-8")
    .to("/path/to/the/ouput-file.csv");

我考虑使用自定义制作的https://camel.apache.org/maven/camel-2.15.0/camel-csv/apidocs/org/apache/camel/dataformat/csv/CsvDataFormat.html我可以提供给.marshal(myCustomCsvDataFormat),但由于返回类型不兼容,我再也无法将调用链接到bindy(...)

所以,在这一点上我被卡住了,任何提示都会非常受欢迎。

感谢。

1 个答案:

答案 0 :(得分:0)

在版本2.19.0中引入了mapquotingEscaped

  

指出引用时是否必须转义值

Source (CAMEL-7519)

<强>更新

我能够使用Camel CSV在输出文件中输入您想要的结果(“Some”;“people”;“Never”“finish”“”;“他们的”):

@CsvRecord

from("myRouteId") .process(exchange -> { ObjectMapper mapper = new ObjectMapper(); Map<String, String> map = mapper.convertValue(new SimplePojo(), Map.class); exchange.getIn().setBody(map); }) .marshal(new CsvDataFormat().setDelimiter(';').setQuoteMode(QuoteMode.ALL)) .to("file:out/?fileName=ouput-file.csv"); 内容为:

SimplePojo