编辑:超级 CSV 2.1.0 的更新
从 Super CSV 2.1.0 开始,您现在可以QuoteMode
通过首选项指定 a 以在通常不需要引号时启用引号。要引用每一列,您可以使用内置的AlwaysQuoteMode
. 如果要为特定列启用引号,请使用ColumnQuoteMode
. 请注意,您不能以这种方式禁用引用,您必须自己CsvEncoder
提供才能这样做。
感谢您提请我注意该论坛帖子!看起来 Kasper 并没有解决这个问题。我会看看我能为即将发布的版本做些什么:)
您可以在自己的项目中扩展 Super CSV 实现,而不是破解 Super CSV 源代码来添加“引用所有内容”功能。正如您所提到的,Super CSV 仅在包含特殊字符(引号、逗号等)时才引用整个字段 - 如果字段包含前导/尾随空格,它也会这样做。
考虑到这一点,您没有理由不能编写自己的方法Writer
来覆盖该escapeString()
方法(您只需确保它尚未被引用)。
package org.supercsv.io;
import java.io.Writer;
import org.supercsv.prefs.CsvPreference;
public class QuoteAllCsvBeanWriter extends CsvBeanWriter {
public QuoteAllCsvBeanWriter(Writer writer, CsvPreference preference) {
super(writer, preference);
}
@Override
protected String escapeString(String csvElement) {
// perform normal escaping
final String escaped = super.escapeString(csvElement);
// add surrounding quotes if required
final String quote = String.valueOf((char) preference.getQuoteChar());
if (escaped.startsWith(quote) && escaped.endsWith(quote)){
return escaped;
} else {
return quote + escaped + quote;
}
}
}