OpenCSV CSVWriter不会为null元素

时间:2017-06-22 20:00:48

标签: java csv opencsv

我有一个要求,我需要用引号字符包装所有元素。

我正在使用CSVWriter来编写行

CSVWriter writer = new CSVWriter(new FileWriter(rptFileName),`CSVWriter.DEFAULT_SEPARATOR, CSVWriter.DEFAULT_QUOTE_CHARACTER);

当一个元素是一个空字符串时,它会包装引号,如果它是null,那么它不会引用引号字符。

所以mu输出变得像这样。

"ABC",,"","DEF"

我想要

"ABC","","","DEF"

这里第二个元素是null,第三个元素是空字符串。

OpenCSV中有没有办法在没有人工干预的情况下实现这一目标?

3 个答案:

答案 0 :(得分:0)

我不认为你可以用" auto"中的CSVWriter来做到这一点。模式。只需在代码中手动将空""值分配给null字符串。

答案 1 :(得分:0)

由于您不想手动更改每一行,可以给univocity-parsers一个去:

//configure writer
CsvWriterSettings settings = new CsvWriterSettings();
settings.setQuoteAllFields(true);

如果要编写行(或行列表):

//create writer with given config and output file
CsvWriter writer = new CsvWriter(new File(rptFileName), "UTF-8", settings);

//get your data from somewhere
List<Object[]> dataToWrite = getDataFromSomewhere();

//write everything.
writer.writeRowsAndClose(dataToWrite);

如果要从ResultSet转储数据:

ResultSet rs = getDataFromSomewhere();
new CsvRoutines(settings).write(rs, new File(rptFileName), "UTF-8");

无需手动更改输入,即可完成所需操作。

披露:我是这个库的作者,它是开源和免费的(Apache 2.0许可证)

答案 2 :(得分:0)

没有像这样有目的地设计CSVWriter,因此CSVReader可以区分什么是null和什么是空字符串。后来的版本添加了一个CSVReaderNullFieldIndicator,因此用户可以决定什么是null(如果有空),但同样没有扩展到CSVWriter。因此,如果您希望坚持使用openCSV,则必须进行一些手动干预。

如果无法进行手动干预,您可以使用Apache Commons库来帮助您

String[] copyArray = ArrayUtils.clone(originalValues);
for (int i = 0; i < copyArray.size; i++) {
   copyArray[i] = StringUtils.defaultString(copyArray[i]);
}

//  now use the CSVWriter to write the copyArray.