我正在使用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上,但似乎没有人给我我想要的结果。
答案 0 :(得分:2)
解决方案分为两部分:
首先,请确保您使用的是版本2.2.3,因为它刚刚发布时会调整以正确捕获引用转义字符(如果它没有被转义),这是您的情况:
此处/
未转义:
"Alex ,/,awesome/,"
2.2.3之前的版本会期望:
"Alex ,//,awesome//,"
第二次,当将其写回输出时,您不希望编写转义转义符,即给定字符串"Alex ,/,awesome/,"
你想得到:
"Alex ,/,awesome/,"
而不是默认情况下会做什么:
"Alex ,//,awesome//,"
在CsvWriterSettings上,执行以下操作:
settings.getFormat().setCharToEscapeQuoteEscaping('\0');
它不会试图逃避引用转义字符。
希望有所帮助