【问题标题】:Camel-bindy : How to escape double quotes when marshalling CSV?Camel-bindy:编组 CSV 时如何转义双引号?
【发布时间】:2017-10-18 22:16:00
【问题描述】:

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

我想产生什么(注意字段内容中的双引号是如何通过加倍来转义的):

“一些”;“人”;“从不”“完成”“”;“他们的”

我实际生成的内容(不会解析为 CSV):

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

所以,

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

到目前为止,以下是我所做的状态: 我的骆驼版本是 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 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(...) 的调用。

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

谢谢。

【问题讨论】:

  • 尝试使用较新的 Camel 版本 - 2.15.0 有点旧,已停产。
  • @ClausIbsen 我已经升级到 Camel 2.17.3 不过,我在 API 中没有发现任何可以帮助回答我的问题的变化/新颖性。更具体地说: - 我在@CsvRecord@DataField 中都没有找到任何新选项 - 我仍然不能做.marshal(myCustomCsvDataFormat) 然后.bindy(...) 我错过了什么吗?
  • 转义引号通常是 \" 而不是 ""

标签: java csv apache-camel


【解决方案1】:

在 2.19.0 版本中引入了 quotingEscaped@CsvRecord

指明引用时是否必须对值进行转义

Source (CAMEL-7519)

更新:

我能够使用Camel CSV 在输出文件中获得您想要的结果("Some";"people";"Never ""finish""";"their"): p>

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 内容在哪里:

private String name = "Some";
private String people = "people";
private String never = "Never \"finish\"";
private String finish = "their"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 2020-02-21
    相关资源
    最近更新 更多