Skip to content

Commit

Permalink
Fixes issue 725 (#767)
Browse files Browse the repository at this point in the history
Adds an option to CsvWriteOptions to specify that all fields should be quoted. The result is that all output is quoted, including column headers and any column data regardless of column type.

The implementation simply passes the arguments to the equivalent Univocity code, which does the rest.
  • Loading branch information
lwhite1 authored Feb 23, 2020
1 parent 1cb254b commit 038905d
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 1 deletion.
19 changes: 19 additions & 0 deletions core/src/main/java/tech/tablesaw/io/csv/CsvWriteOptions.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public class CsvWriteOptions extends WriteOptions {
private final char quoteChar;
private final char escapeChar;
private final String lineEnd;
private final boolean quoteAllFields;

private CsvWriteOptions(Builder builder) {
super(builder);
Expand All @@ -27,6 +28,7 @@ private CsvWriteOptions(Builder builder) {
this.lineEnd = builder.lineEnd;
this.ignoreLeadingWhitespaces = builder.ignoreLeadingWhitespaces;
this.ignoreTrailingWhitespaces = builder.ignoreTrailingWhitespaces;
this.quoteAllFields = builder.quoteAllFields;
}

public boolean header() {
Expand All @@ -49,6 +51,10 @@ public char escapeChar() {
return escapeChar;
}

public boolean quoteAllFields() {
return quoteAllFields;
}

public char quoteChar() {
return quoteChar;
}
Expand Down Expand Up @@ -82,6 +88,7 @@ public static class Builder extends WriteOptions.Builder {
private boolean header = true;
private boolean ignoreLeadingWhitespaces = true;
private boolean ignoreTrailingWhitespaces = true;
private boolean quoteAllFields = false;
private char separator = ',';
private String lineEnd = System.lineSeparator();
private char escapeChar = '\\';
Expand Down Expand Up @@ -117,6 +124,18 @@ public CsvWriteOptions.Builder quoteChar(char quoteChar) {
return this;
}

/**
* Causes all data exported as a CSV file to be enclosed in quotes. Note that this includes the
* headers, and all columns regardless of type
*
* @param quoteAll {@code} true, to cause all data and column headers to be quoted.
* @return this CsvWriteOptionsBuilder
*/
public CsvWriteOptions.Builder quoteAllFields(boolean quoteAll) {
this.quoteAllFields = quoteAll;
return this;
}

public CsvWriteOptions.Builder escapeChar(char escapeChar) {
this.escapeChar = escapeChar;
return this;
Expand Down
1 change: 1 addition & 0 deletions core/src/main/java/tech/tablesaw/io/csv/CsvWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ protected static CsvWriterSettings createSettings(CsvWriteOptions options) {
settings.setIgnoreTrailingWhitespaces(options.ignoreTrailingWhitespaces());
// writes empty lines as well.
settings.setSkipEmptyLines(false);
settings.setQuoteAllFields(options.quoteAllFields());
return settings;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ public void testSettingsPropagation() {
.lineEnd("\r\n")
.quoteChar('"')
.separator('.')
.quoteAllFields(true)
.ignoreLeadingWhitespaces(true)
.ignoreTrailingWhitespaces(true)
.build();
Expand All @@ -28,9 +29,10 @@ public void testSettingsPropagation() {
assertEquals('.', options.separator());
assertTrue(options.ignoreLeadingWhitespaces());
assertTrue(options.ignoreTrailingWhitespaces());
assertTrue(options.quoteAllFields());

CsvWriterSettings settings = CsvWriter.createSettings(options);

assertTrue(settings.getQuoteAllFields());
assertEquals('~', settings.getFormat().getQuoteEscape());
assertEquals("\r\n", settings.getFormat().getLineSeparatorString());
assertEquals('"', settings.getFormat().getQuote());
Expand Down
12 changes: 12 additions & 0 deletions core/src/test/java/tech/tablesaw/io/csv/CsvWriterTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,16 @@ public void toWriterWithExtension() throws IOException {
table.write().toWriter(writer, "csv");
assertEquals("colA,colB\na,1\nb,2\n", writer.toString().replaceAll("\\r\\n", "\n"));
}

@Test
public void quoteAll() throws IOException {
StringColumn colA = StringColumn.create("colA", ImmutableList.of("a", "b"));
StringColumn colB = StringColumn.create("colB", ImmutableList.of("1", "2"));
Table table = Table.create("testTable", colA, colB);
StringWriter writer = new StringWriter();
table.write().usingOptions(CsvWriteOptions.builder(writer).quoteAllFields(true).build());
assertEquals(
"\"colA\",\"colB\"\n\"a\",\"1\"\n\"b\",\"2\"\n",
writer.toString().replaceAll("\\r\\n", "\n"));
}
}

0 comments on commit 038905d

Please sign in to comment.