@@ -499,6 +499,8 @@ private Headers createHeaders() throws IOException {
499499
500500 // build the name to index mappings
501501 if (headerRecord != null ) {
502+ // Track an occurrence of a null, empty or blank header.
503+ boolean observedMissing = false ;
502504 for (int i = 0 ; i < headerRecord .length ; i ++) {
503505 final String header = headerRecord [i ];
504506 final boolean blankHeader = CSVFormat .isBlank (header );
@@ -507,7 +509,7 @@ private Headers createHeaders() throws IOException {
507509 "A header name is missing in " + Arrays .toString (headerRecord ));
508510 }
509511
510- final boolean containsHeader = header != null && hdrMap .containsKey (header );
512+ final boolean containsHeader = blankHeader ? observedMissing : hdrMap .containsKey (header );
511513 final DuplicateHeaderMode headerMode = this .format .getDuplicateHeaderMode ();
512514 final boolean duplicatesAllowed = headerMode == DuplicateHeaderMode .ALLOW_ALL ;
513515 final boolean emptyDuplicatesAllowed = headerMode == DuplicateHeaderMode .ALLOW_EMPTY ;
@@ -518,6 +520,7 @@ private Headers createHeaders() throws IOException {
518520 "The header contains a duplicate name: \" %s\" in %s. If this is valid then use CSVFormat.Builder.setDuplicateHeaderMode()." ,
519521 header , Arrays .toString (headerRecord )));
520522 }
523+ observedMissing |= blankHeader ;
521524 if (header != null ) {
522525 hdrMap .put (header , Integer .valueOf (i ));
523526 if (headerNames == null ) {
0 commit comments