Java Univocity-即使字段不包含分隔符字符,也要写出周围的引号
我从数据库卸载了一个文件,所有varchar列都用引号括起来,而不管列的实际内容如何(不幸的是,卸载过程超出了我的控制范围) 像这样:Java Univocity-即使字段不包含分隔符字符,也要写出周围的引号,java,oracle11g,univocity,Java,Oracle11g,Univocity,我从数据库卸载了一个文件,所有varchar列都用引号括起来,而不管列的实际内容如何(不幸的是,卸载过程超出了我的控制范围) 像这样: 1,"Alex ,/,awesome/,","chan" 2,"Peter ,boring","pitt" 在pom中使用univocity 2.2.3的以下代码时: public class Sample { public static void main(String[] args) throws IOException {
1,"Alex ,/,awesome/,","chan"
2,"Peter ,boring","pitt"
在pom中使用univocity 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('\0');
settings.setRowWriterProcessor(new BeanWriterProcessor<Person>(Person.class));
CsvWriter writer = new CsvWriter(outputWriter, settings);
for (Person person : beans) {
writer.processRecord(person);
}
writer.close();
}
}
使用settings.setQuoteAllFields时(true)
在writer设置中,所有字段都用引号括起来,但现在非varchar字段出现了问题
如何仅将源中被引号包围的列用引号括起来,而不考虑列的内容(例如,分隔符是否存在)
预期结果:
1,"Alex ,/,awesome/,","chan"
2,"Peter ,boring","pitt"
CSV编写器没有提供明确的机制来配置此功能,但您可以执行以下操作:
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();
}
}
};
使用以下命令进行分析:
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();
}
}
};
CsvWriter writer=新的CsvWriter(outputWriter,设置){
@凌驾
受保护的void processRow(对象[]行){
for(int i=0;i
这将产生您所期望的输出,但我不确定它是否非常有用,因为您只需依赖于正确格式化的输入,对其进行更改将使事情变得相当复杂
这里要做的适当的事情是向库中添加一个额外的配置选项,该选项允许您配置是否引用给定的列