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=]');
并且它不会尝试转义引号转义字符。
希望对您有所帮助
我正在使用 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=]');
并且它不会尝试转义引号转义字符。
希望对您有所帮助