Hello Commons-Devs,

Related Jira issue: https://issues.apache.org/jira/browse/CSV-310

Scenario:
When we try to print CSV content using the CSVFormat and CSVPrinter, we can
get it done with the following sample code.

public void testHappyPath() throws IOException {
    CSVFormat csvFormat = CSVFormat.DEFAULT.builder()
            .setHeader("Col1", "Col2", "Col3", "Col4")
            .setQuoteMode(QuoteMode.NONE)
            .setEscape('#')
            .build();

    CSVPrinter printer = new CSVPrinter(System.out, csvFormat);

    List<String[]> temp = new ArrayList<>();

    temp.add(new String[] { "rec1", "rec2\"", "", "rec4" });
    temp.add(new String[] { "", "rec6", "rec7", "rec8" });

    for (String[] temp1 : temp) {
        printer.printRecord(temp1);
    }
    printer.close();
}

In the above sample I have used 'setQuoteMode(QuoteMode.NONE)'. However, if
we do not set the escape character using 'setEscape('#')' then it would
result in the following exception.
*java.lang.IllegalArgumentException: No quotes mode set but no escape
character is set.*

At first, I was wondering why I was getting this error. Then I looked into
the source and figured out that the CSVFormat.printWithEscapes() method
internally uses the 'getEscapeCharacter().charValue()' method to print
records.
However, the error message which we are getting is sort of misleading. It
implies that the code has not set any quote mode even though we set it.
Simple and more meaningful exception message could be: *Quote mode set to
NONE but no escape character is set.*

Please see the PR created on this:
https://github.com/apache/commons-csv/pull/352

Thank you.
Buddhi De SIlva.

Reply via email to