我从数据库中卸载了一个文件,所有的varchar列都用引号括起来,而不管列的实际内容是什么(不幸的是卸载过程不在我的控制范围之内)。
:
1,"Alex ,/,awesome/,","chan"
2,"Peter ,boring","pitt"
当在pom中使用以下唯一性2.2.3代码时:
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.getFormat().setCharToEscapeQuoteEscaping(' ');
settings.setRowWriterProcessor(new BeanWriterProcessor<Person>(Person.class));
CsvWriter writer = new CsvWriter(outputWriter, settings);
for (Person person : beans) {
writer.processRecord(person);
}
writer.close();
}
}
只有包含分隔符的列用引号括起来:
1,"Alex ,/,awesome/,",chan
2,"Peter ,boring",pitt
当在写入器设置上使用settings.setQuoteAllFields(true);
时,所有字段都被引号包围,但是现在非varchar字段有麻烦了。
我如何只用引号包围来自源的列,而不管列的内容(例如分隔符是否存在)?
预期的结果:
1,"Alex ,/,awesome/,","chan"
2,"Peter ,boring","pitt"
CSV编写器没有提供显式的机制来配置它,但是您可以做以下操作:
解析:
parserSettings.setKeepQuotes(true);
parserSettings.setKeepEscapeSequences(true);
这两个设置将有效地作为输入CSV的"分割"操作-您将在分隔符之间获得整个内容。使用您的示例输入,这些值将被解析为:
1 | "Alex ,/,awesome/," | chan |
2 | "Peter boring" | pitt |
我使用管道来分隔上面的值,以便更容易看到输出的内容。
现在,黑客位,我不能保证这将与库的未来版本工作,因为它使用内部API: CsvWriter
有一个processRow
方法,你可以覆盖。由于输入值已按照您希望的方式进行了适当的格式化,因此只需将每行的值用逗号连接起来,就可以"按原样"输出它们。只需执行以下操作:
CsvWriter writer = new CsvWriter(outputWriter, settings){
@Override
protected void processRow(Object[] row) {
for(int i = 0; i < row.length; i++){
Object value = row[i];
appender.append(value.toString());
if(i + 1 < row.length) { //not the last column
appender.append(',');
}
appendValueToRow();
}
}
};
这将产生您期望的输出,但我不确定它是否非常有用,因为您只是依赖于输入正确格式化,并且对其进行更改将使事情变得相当复杂。