diff --git a/csv/pom.xml b/csv/pom.xml index b798cd7b..31fa06e2 100644 --- a/csv/pom.xml +++ b/csv/pom.xml @@ -4,7 +4,7 @@ com.fasterxml.jackson.dataformat jackson-dataformats-text - 2.11.1 + 2.11.2 jackson-dataformat-csv Jackson-dataformat-CSV diff --git a/csv/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvParser.java b/csv/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvParser.java index 5259636d..de5ea354 100644 --- a/csv/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvParser.java +++ b/csv/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvParser.java @@ -763,7 +763,6 @@ protected void _readHeaderLine() throws IOException { while ((name = _reader.nextString()) != null) { // one more thing: always trim names, regardless of config settings name = name.trim(); - // See if "old" schema defined type; if so, use that type... CsvSchema.Column prev = _schema.column(name); if (prev != null) { @@ -776,6 +775,11 @@ protected void _readHeaderLine() throws IOException { } } + // [dataformats-text#204]: Drop trailing empty name if so instructed + if (CsvParser.Feature.ALLOW_TRAILING_COMMA.enabledIn(_formatFeatures)) { + builder.dropLastColumnIfEmpty(); + } + // Ok: did we get any columns? CsvSchema newSchema = builder.build(); int size = newSchema.size(); @@ -1002,6 +1006,7 @@ protected JsonToken _handleExtraColumn(String value) throws IOException if (next == null) { // should end of record or input return _handleObjectRowEnd(); } + System.err.println("... yet we did NOT skip"); } } // 21-May-2015, tatu: Need to enter recovery mode, to skip remainder of the line diff --git a/csv/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvSchema.java b/csv/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvSchema.java index 681b7ec3..9e7fdb2f 100644 --- a/csv/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvSchema.java +++ b/csv/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvSchema.java @@ -558,6 +558,22 @@ public Builder renameColumn(int index, String newName) { return this; } + /** + * Helper method called to drop the last collected column name if + * it is empty: called if {link CsvParser.Feature#ALLOW_TRAILING_COMMA} + * enabled to remove the last entry after being added initially. + * + * @since 2.11.2 + */ + public void dropLastColumnIfEmpty() { + final int ix = _columns.size() - 1; + if (ix >= 0) { + if (_columns.get(ix).getName().isEmpty()) { + _columns.remove(ix); + } + } + } + public Builder setColumnType(int index, ColumnType type) { _checkIndex(index); _columns.set(index, _columns.get(index).withType(type)); @@ -795,7 +811,7 @@ public Builder setNullValue(char[] nvl) { _nullValue = nvl; return this; } - + public CsvSchema build() { Column[] cols = _columns.toArray(new Column[_columns.size()]); @@ -817,7 +833,7 @@ protected void _checkIndex(int index) { /* Configuration, construction /********************************************************************** */ - + /** * Column definitions, needed for optional header and/or mapping * of field names to column positions. diff --git a/csv/src/test/java/com/fasterxml/jackson/dataformat/csv/deser/TrailingCommaTest.java b/csv/src/test/java/com/fasterxml/jackson/dataformat/csv/deser/TrailingCommaCSVTest.java similarity index 52% rename from csv/src/test/java/com/fasterxml/jackson/dataformat/csv/deser/TrailingCommaTest.java rename to csv/src/test/java/com/fasterxml/jackson/dataformat/csv/deser/TrailingCommaCSVTest.java index 9192c19f..81d6d367 100644 --- a/csv/src/test/java/com/fasterxml/jackson/dataformat/csv/deser/TrailingCommaTest.java +++ b/csv/src/test/java/com/fasterxml/jackson/dataformat/csv/deser/TrailingCommaCSVTest.java @@ -1,5 +1,7 @@ package com.fasterxml.jackson.dataformat.csv.deser; +import java.util.List; + import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.MappingIterator; @@ -8,14 +10,20 @@ import com.fasterxml.jackson.dataformat.csv.CsvSchema; import com.fasterxml.jackson.dataformat.csv.ModuleTestBase; -public class TrailingCommaTest extends ModuleTestBase { - final CsvMapper MAPPER = mapperForCsv(); - +public class TrailingCommaCSVTest extends ModuleTestBase +{ @JsonPropertyOrder({ "a", "b" }) static class StringPair { public String a, b; } + static class Person { + public String name; + public int age; + } + + private final CsvMapper MAPPER = mapperForCsv(); + public void testDisallowTrailingComma() throws Exception { final String INPUT = "s,t\nd,e,\n"; @@ -36,4 +44,32 @@ public void testDisallowTrailingComma() throws Exception it.close(); } + + // [dataformats-text#204]: should also work for header line + + public void testWithTrailingHeaderComma() throws Exception + { + final String INPUT = "name,age,\n" + + "Roger,27,\n" + + "Chris,53,\n"; + final CsvSchema schema = CsvSchema.emptySchema().withHeader(); + + MappingIterator persons = MAPPER + .enable(CsvParser.Feature.ALLOW_TRAILING_COMMA) + .readerFor(Person.class) + .with(schema) + . readValues(INPUT); + assertTrue(persons.hasNextValue()); + Person p = persons.nextValue(); + assertNotNull(p); + assertEquals("Roger", p.name); + + assertTrue(persons.hasNextValue()); + p = persons.nextValue(); + assertNotNull(p); + assertEquals(53, p.age); + + assertFalse(persons.hasNextValue()); + persons.close(); + } } diff --git a/pom.xml b/pom.xml index e362fa04..0502b055 100644 --- a/pom.xml +++ b/pom.xml @@ -3,12 +3,12 @@ com.fasterxml.jackson jackson-base - 2.11.1 + 2.11.2 com.fasterxml.jackson.dataformat jackson-dataformats-text Jackson dataformats: Text - 2.11.1 + 2.11.2 pom Parent pom for Jackson text-based dataformats (as opposed to binary). @@ -24,7 +24,7 @@ scm:git:git@github.com:FasterXML/jackson-dataformats-text.git scm:git:git@github.com:FasterXML/jackson-dataformats-text.git http://github.com/FasterXML/jackson-dataformats-text - jackson-dataformats-text-2.11.1 + jackson-dataformats-text-2.11.2 https://github.com/FasterXML/jackson-dataformats-text/issues diff --git a/properties/pom.xml b/properties/pom.xml index db38789d..4333f85e 100644 --- a/properties/pom.xml +++ b/properties/pom.xml @@ -4,7 +4,7 @@ com.fasterxml.jackson.dataformat jackson-dataformats-text - 2.11.1 + 2.11.2 jackson-dataformat-properties Jackson-dataformat-Properties diff --git a/release-notes/CREDITS-2.x b/release-notes/CREDITS-2.x index fd2a0868..6d54171b 100644 --- a/release-notes/CREDITS-2.x +++ b/release-notes/CREDITS-2.x @@ -137,3 +137,7 @@ Francesco Tumanischvili (frantuma@github) * Contibuted fix for #201: (yaml) Improve `MINIMIZE_QUOTES` handling to avoid quoting for some uses of `#` and `:` (2.11.1) + +Björn Michael (bjmi@github) +* Reported #204: `CsvParser.Feature.ALLOW_TRAILING_COMMA` doesn't work with header columns + (2.11.2) diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x index 3ba6f182..baac3bfd 100644 --- a/release-notes/VERSION-2.x +++ b/release-notes/VERSION-2.x @@ -8,6 +8,11 @@ Project: jackson-datatypes-text === Releases === ------------------------------------------------------------------------ +2.11.2 (02-Aug-2020) + +#204: `CsvParser.Feature.ALLOW_TRAILING_COMMA` doesn't work with header columns + (reported by Björn M) + 2.11.1 (25-Jun-2020) #51: (yaml) `YAMLParser._locationFor()` does not use index available from `Mark` @@ -33,10 +38,12 @@ Project: jackson-datatypes-text #195 (csv) Adds schema creating csv schema with View (contributed by Damian S) -2.10.5 (not yet released) +2.10.5 (21-Jul-2020) -#146: Jackson can't handle underscores in numbers +#146: (yaml) Jackson can't handle underscores in numbers (reported by Sergey M; fix contributed by Conor W) +#204: (csv) `CsvParser.Feature.ALLOW_TRAILING_COMMA` doesn't work with header columns + (reported by Björn M) 2.10.4 (03-May-2020) diff --git a/yaml/pom.xml b/yaml/pom.xml index a4bc2ca1..5b4f7087 100644 --- a/yaml/pom.xml +++ b/yaml/pom.xml @@ -4,7 +4,7 @@ com.fasterxml.jackson.dataformat jackson-dataformats-text - 2.11.1 + 2.11.2 jackson-dataformat-yaml bundle