Skip to content

Commit 609a228

Browse files
committed
keep quoted empty trailing field with trailingDelimiter
1 parent 0633c98 commit 609a228

2 files changed

Lines changed: 20 additions & 1 deletion

File tree

src/main/java/org/apache/commons/csv/CSVParser.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -580,7 +580,9 @@ public CSVParser(final Reader reader, final CSVFormat format, final long charact
580580

581581
private void addRecordValue(final boolean lastRecord) {
582582
final String input = format.trim(reusableToken.content.toString());
583-
if (lastRecord && input.isEmpty() && format.getTrailingDelimiter()) {
583+
// Only drop the empty field produced by an actual trailing delimiter. A quoted empty
584+
// field ("") is a real value, not a trailing delimiter, so it must be kept.
585+
if (lastRecord && input.isEmpty() && format.getTrailingDelimiter() && !reusableToken.isQuoted) {
584586
return;
585587
}
586588
recordList.add(handleNull(input));

src/test/java/org/apache/commons/csv/CSVParserTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1949,6 +1949,23 @@ void testTrailingDelimiter() throws Exception {
19491949
}
19501950
}
19511951

1952+
@Test
1953+
void testTrailingDelimiterKeepsQuotedEmptyLastField() throws Exception {
1954+
final CSVFormat format = CSVFormat.DEFAULT.builder().setTrailingDelimiter(true).get();
1955+
try (CSVParser parser = CSVParser.parse("a,b,\"\"", format)) {
1956+
final CSVRecord record = parser.iterator().next();
1957+
assertEquals(3, record.size());
1958+
assertEquals("a", record.get(0));
1959+
assertEquals("b", record.get(1));
1960+
assertEquals("", record.get(2));
1961+
}
1962+
// An unquoted trailing delimiter still drops the empty field.
1963+
try (CSVParser parser = CSVParser.parse("a,b,", format)) {
1964+
final CSVRecord record = parser.iterator().next();
1965+
assertEquals(2, record.size());
1966+
}
1967+
}
1968+
19521969
@Test
19531970
void testTrim() throws Exception {
19541971
final Reader in = new StringReader("a,a,a\n\" 1 \",\" 2 \",\" 3 \"\nx,y,z");

0 commit comments

Comments
 (0)