Skip to content

Commit 2d6d4b0

Browse files
authored
Fix #31: add CsvParser.Feature.TRIM_HEADER_SPACES (#521)
1 parent c78cfc4 commit 2d6d4b0

4 files changed

Lines changed: 54 additions & 3 deletions

File tree

csv/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvParser.java

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,29 @@ public enum Feature
4747
* values (white space outside of double-quotes is never included regardless
4848
* of trimming).
4949
*<p>
50+
* NOTE: this setting has no effect on header rows: see {@link #TRIM_HEADER_SPACES}
51+
* for corresponding setting.
52+
*<p>
5053
* Default value is false, as per <a href="http://tools.ietf.org/html/rfc4180">RFC-4180</a>.
5154
*/
5255
TRIM_SPACES(false),
5356

57+
/**
58+
* Feature determines whether spaces around separator characters
59+
* (commas) in header line entries (header names) are to be automatically
60+
* trimmed before being reported or not.
61+
* Note that this does NOT force trimming of possible white space from
62+
* within double-quoted values, but only those surrounding unquoted
63+
* values (white space outside of double-quotes is never included regardless
64+
* of trimming).
65+
*<p>
66+
* Default value is {@code true} for backwards compatibility (before 2.19 trimming
67+
* was always performed)
68+
*
69+
* @since 2.19
70+
*/
71+
TRIM_HEADER_SPACES(true),
72+
5473
/**
5574
* Feature that determines how stream of records (usually CSV lines, but sometimes
5675
* multiple lines when linefeeds are included in quoted values) is exposed:
@@ -898,10 +917,13 @@ protected void _readHeaderLine() throws IOException {
898917
CsvSchema.Builder builder = _schema.rebuild().clearColumns();
899918
int count = 0;
900919

920+
final boolean trimHeaderNames = Feature.TRIM_HEADER_SPACES.enabledIn(_formatFeatures);
901921
while ((name = _reader.nextString()) != null) {
902922
// one more thing: always trim names, regardless of config settings
903-
// TODO!!! [dataformats-text#31]: Allow disabling of trimming
904-
name = name.trim();
923+
// [dataformats-text#31]: Allow disabling of trimming
924+
if (trimHeaderNames) {
925+
name = name.trim();
926+
}
905927
// See if "old" schema defined type; if so, use that type...
906928
CsvSchema.Column prev = _schema.column(name);
907929
if (prev != null) {

csv/src/test/java/com/fasterxml/jackson/dataformat/csv/deser/ParserWithHeaderTest.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,30 @@ public void testSimpleHeader() throws Exception
4949
}
5050

5151
// But! Can change header name trimming:
52-
// [dataformats-text#31]: Allow disabling header name trimming
52+
// [dataformats-text#31]: Allow disabling header row trimming
53+
try (CsvParser parser = (CsvParser) MAPPER.reader()
54+
.without(CsvParser.Feature.TRIM_HEADER_SPACES)
55+
.createParser(
56+
"name, age,other \nfoo,2,xyz\n")) {
57+
// need to enable first-line-as-schema handling:
58+
parser.setSchema(CsvSchema.emptySchema().withHeader());
59+
assertToken(JsonToken.START_OBJECT, parser.nextToken());
60+
CsvSchema schema = parser.getSchema();
61+
assertEquals(3, schema.size());
62+
63+
// Verify header names are NOT trimmed when disabled
64+
assertEquals("name", schema.columnName(0));
65+
assertEquals(" age", schema.columnName(1));
66+
assertEquals("other ", schema.columnName(2));
67+
68+
assertEquals("name", parser.nextFieldName());
69+
assertEquals("foo", parser.nextTextValue());
70+
assertEquals(" age", parser.nextFieldName());
71+
assertEquals("2", parser.nextTextValue());
72+
assertEquals("other ", parser.nextFieldName());
73+
assertEquals("xyz", parser.nextTextValue());
74+
assertToken(JsonToken.END_OBJECT, parser.nextToken());
75+
}
5376
}
5477

5578
public void testSimpleQuotes() throws Exception

release-notes/CREDITS-2.x

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,3 +285,7 @@ Burdyug Pavel (@Pavel38l)
285285
* Reported #485: (csv) CSVDecoder: No Long and Int out of range exceptions
286286
(2.18.0)
287287
288+
Robert DiFalco (@rdifalco)
289+
290+
* Reported #31: Header names seem to be trimmed
291+
(2.19.0)

release-notes/VERSION-2.x

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ Active Maintainers:
1616

1717
2.19.0 (not yet released)
1818

19+
#31: Header names seem to be trimmed
20+
(reported by Robert D)
1921
#502: Add an optional extended parser subclass (`YAMLAnchorReplayingFactory`)
2022
able to inline anchors
2123
(contributed by Heiko B)

0 commit comments

Comments
 (0)