简体   繁体   中英

OpenCSV quoting null values

Using the OpenCSV library, calling StatefulBeanToCsv.write() my null values are being wrapped in quotes.

Example:

String[] columns = new String[] {
    "Col1",
    "Col2",
    "Col3"
};

ColumnPositionMappingStrategy strat = new ColumnPositionMappingStrategy();
strat.setColumnMapping(columns);

Writer writer = new FileWriter(outputFilePath);
StatefulBeanToCsv beanToCsv = new StatefulBeanToCsvBuilder(writer)
        .withMappingStrategy(strat)
        .build();
beanToCsv.write(items);
writer.close();

will produce:

1,"",3

When I expect:

"1",,"3"

I have not set quotes to all fields via .withApplyQuotesToAll(true) .

If I do use .withApplyQuotesToAll(true) , I end up with

"1","","3"

At one point, it appears the library the opposite of this:

OpenCSV CSVWriter does not add quote character for null element

How can I null values written as a blank/empty value, rather than an empty string?

It looks like the method that you mentioned not calling actually takes a boolean. Have you tried the following?

.withApplyQuotesToAll(false)

There is a way to do that. Setting .withApplyQuotesToAll(false) tells OpenCSV to only quote elements that has special characters, but we can change what OpenCSV understands by that, extending CSVWrite class like this:

public class CustomCsvWriter extends CSVWriter {

    public CustomCsvWriter(Writer writer) {
        super(writer);
    }

    @Override
    protected boolean stringContainsSpecialCharacters(String line) {
        return !line.isEmpty();
     }
}

So, you can create a StatefulBeanToCsv like this:

new StatefulBeanToCsvBuilder<>(new CustomCsvWriter(writer))
   .withMappingStrategy(strat)
   .withApplyQuotesToAll(false)
   .build();

Tested with OpenCSV 5.3

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM