diff --git a/src/main/java/com/j256/simplecsv/processor/CsvProcessor.java b/src/main/java/com/j256/simplecsv/processor/CsvProcessor.java index 16f47bf..c31eb4f 100644 --- a/src/main/java/com/j256/simplecsv/processor/CsvProcessor.java +++ b/src/main/java/com/j256/simplecsv/processor/CsvProcessor.java @@ -973,7 +973,8 @@ private String[] processHeader(String line, ParseError parseError, int lineNumbe + localParseError + "): " + lineInfo.line, lineInfo.linePos); } } - if (sb.length() > 0) { + if (!atEnd || (lineInfo.line.length() > 0 + && lineInfo.line.charAt(lineInfo.line.length() - 1) == columnSeparator)) { headerColumns.add(sb.toString()); } if (atEnd) { diff --git a/src/test/java/com/j256/simplecsv/processor/EmptyHeaderTest.java b/src/test/java/com/j256/simplecsv/processor/EmptyHeaderTest.java new file mode 100644 index 0000000..3704774 --- /dev/null +++ b/src/test/java/com/j256/simplecsv/processor/EmptyHeaderTest.java @@ -0,0 +1,54 @@ +package com.j256.simplecsv.processor; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; + +import java.io.BufferedReader; +import java.io.StringReader; + +import org.junit.Test; +import com.j256.simplecsv.common.CsvColumn; + +public class EmptyHeaderTest { + @Test + public void emptyHeaderPreservesColumnPositions() throws Exception { + CsvProcessor processor = new CsvProcessor(Row.class).withIgnoreUnknownColumns(true); + BufferedReader input = new BufferedReader(new StringReader("first,,second\nA,ignored,B\n")); + assertArrayEquals(new String[] {"first", "", "second"}, processor.readHeader(input, null)); + Row row = processor.readRow(input, null); + assertEquals("A", row.first); + assertEquals("B", row.second); + } + + @Test + public void quotedEmptyHeaderPreservesColumnPositions() throws Exception { + CsvProcessor processor = new CsvProcessor(Row.class).withIgnoreUnknownColumns(true); + BufferedReader input = new BufferedReader(new StringReader("first,\"\",second\nA,ignored,B\n")); + processor.readHeader(input, null); + assertEquals("B", processor.readRow(input, null).second); + } + + @Test + public void leadingAndTrailingEmptyHeadersAreRetained() throws Exception { + CsvProcessor processor = new CsvProcessor(Row.class).withIgnoreUnknownColumns(true); + BufferedReader input = new BufferedReader(new StringReader(",first,second,\nignored,A,B,ignored\n")); + assertArrayEquals(new String[] {"", "first", "second", ""}, processor.readHeader(input, null)); + Row row = processor.readRow(input, null); + assertEquals("A", row.first); + assertEquals("B", row.second); + } + + @Test + public void ordinaryHeaderDoesNotGainAnExtraColumn() throws Exception { + CsvProcessor processor = new CsvProcessor(Row.class); + assertArrayEquals(new String[] {"first", "second"}, processor.readHeader( + new BufferedReader(new StringReader("first,second\n")), null)); + } + + public static class Row { + @CsvColumn + public String first; + @CsvColumn + public String second; + } +}