Univocity - 使用 RowWriterProcessor 写出引号转义字符

Univocity - writing out quote escape character using RowWriterProcessor

我正在使用 univocity 将文件解析为 bean,对对象执行一些魔法,然后将 bean 写回文件。重复我的问题的代码片段:

public class Sample {   

    public static void main(String[] args) throws IOException {
        BeanListProcessor<Person> rowProcessor = new BeanListProcessor<Person>(Person.class);
        CsvParserSettings parserSettings = new CsvParserSettings();
        parserSettings.setProcessor(rowProcessor);
        parserSettings.getFormat().setDelimiter(',');
        parserSettings.getFormat().setQuote('"');
        parserSettings.getFormat().setQuoteEscape('/');
        CsvParser parser = new CsvParser(parserSettings);
        parser.parse(new FileReader("src/main/resources/person.csv"));
        List<Person> beans = rowProcessor.getBeans();

        Writer outputWriter = new FileWriter("src/main/resources/personOut.csv", true);
        CsvWriterSettings settings = new CsvWriterSettings();
        settings.getFormat().setDelimiter(',');
        settings.getFormat().setQuote('"');
        settings.getFormat().setQuoteEscape('/');       
        settings.setRowWriterProcessor(new BeanWriterProcessor<Person>(Person.class));
        CsvWriter writer = new CsvWriter(outputWriter, settings);
        for (Person person : beans) {
            writer.processRecord(person);
        }
        writer.close();
    }
} 

Bean class(省略了 getter 和 setter):

public class Person {
    @Parsed(index = 0)
    private int id;
    @Parsed(index = 1)
    private String firstName;
    @Parsed(index = 2)
    private String lastName;
}

及文件内容(输入):

1,"Alex ,/,awesome/,",chan
2,"Peter ,boring",pitt

该文件由第三方提供,不受我控制。在应用程序对对象(未包含在代码片段中)执行操作后,我需要使用完全相同的设置 return 将文件发送给外部方。

想要的文件输出内容:

1,"Alex ,/,awesome/,",chan
2,"Peter ,boring",pitt

但是我得到:

1,"Alex ,,awesome,",chan
2,"Peter ,boring",pitt

有没有办法在将 bean 写回文件时包含实际使用的引号转义字符?

编辑

我已经尝试在 writer 上使用 settings.setQuoteAllFields(true); 以及

的所有组合
parserSettings.setKeepQuotes(true);
parserSettings.setKeepEscapeSequences(true);

在 CsvParserSettings 上,但 none 似乎给了我想要的结果。

这个问题的解决方案分为两部分:

首先,请确保您使用的是2.2.3版本,因为它刚刚发布并进行了调整以正确捕获未转义的引号转义字符,即你的情况:

这里的/没有转义:

"Alex ,/,awesome/,"

2.2.3 之前的版本会这样:

"Alex ,//,awesome//,"

Second,当把这个写回输出时,你不会想写转义转义,即给定字符串"Alex ,/,awesome/," 你想得到:

"Alex ,/,awesome/,"

而不是默认情况下的操作:

"Alex ,//,awesome//,"

在 CsvWriterSettings 上,执行此操作:

settings.getFormat().setCharToEscapeQuoteEscaping('[=14=]');

并且它不会尝试转义引号转义字符。

希望对您有所帮助