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

时间:2016-10-29 18:34:37

标签: java univocity

我正在使用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类(无效的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

该文件不在我的控制范围内,因为它是由外部方提供的。在应用程序对对象执行操作(未包含在代码段中)之后,我需要将文件以完全相同的设置返回给外部方。

所需的文件输出内容:

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

但是我得到了:

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

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

修改

我尝试在作家和

的所有组合上使用settings.setQuoteAllFields(true);
parserSettings.setKeepQuotes(true);
parserSettings.setKeepEscapeSequences(true);

在CsvParserSettings上,但似乎没有人给我我想要的结果。

1 个答案:

答案 0 :(得分:2)

解决方案分为两部分:

首先,请确保您使用的是版本2.2.3,因为它刚刚发布时会调整以正确捕获引用转义字符(如果它没有被转义),这是您的情况:

此处/未转义:

"Alex ,/,awesome/,"

2.2.3之前的版本会期望:

"Alex ,//,awesome//,"

第二次,当将其写回输出时,您不希望编写转义转义符,即给定字符串"Alex ,/,awesome/," 你想得到:

"Alex ,/,awesome/,"

而不是默认情况下会做什么:

"Alex ,//,awesome//,"

在CsvWriterSettings上,执行以下操作:

settings.getFormat().setCharToEscapeQuoteEscaping('\0');

它不会试图逃避引用转义字符。

希望有所帮助