diff --git a/src/Reader/CsvReader.php b/src/Reader/CsvReader.php index f269b63b..32870f91 100644 --- a/src/Reader/CsvReader.php +++ b/src/Reader/CsvReader.php @@ -365,19 +365,30 @@ protected function readHeaderRow($rowNumber) */ protected function incrementHeaders(array $headers) { - $incrementedHeaders = []; - foreach (array_count_values($headers) as $header => $count) { + $incrementedHeaders = [ ]; + + // Get all headlines that are duplicate or more + foreach ( array_count_values ( $headers ) as $header => $count ) { if ($count > 1) { - $incrementedHeaders[] = $header; - for ($i = 1; $i < $count; $i++) { - $incrementedHeaders[] = $header . $i; - } - } else { - $incrementedHeaders[] = $header; + $incrementedHeaders [$header] = 0; } } - return $incrementedHeaders; + // Replace the headers with the new header name but keep the position ($key) in the array + foreach ($headers as $key => $headerName) { + if (isset ($incrementedHeaders [$headerName])) { + $prefix = empty ($headerName) ? 'UNKNOWN' : ''; + $nr = $incrementedHeaders [$headerName]++; + + // to stay compatible with old test + if ($nr == 0) + $nr = ''; + + $headers [$key] = $prefix . $headerName . $nr; + } + } + + return $headers; } /** diff --git a/tests/Fixtures/data_column_headers_duplicates.csv b/tests/Fixtures/data_column_headers_duplicates.csv index c39a0aa2..233d68d0 100644 --- a/tests/Fixtures/data_column_headers_duplicates.csv +++ b/tests/Fixtures/data_column_headers_duplicates.csv @@ -1,2 +1,2 @@ -id,description,description,description,details,details,last -50,"First","Second","Third","Details1","Details2","Last one" +id,description,description,description,details,details,last,, +50,"First","Second","Third","Details1","Details2","Last one","empty1", "empty2" diff --git a/tests/Reader/CsvReaderTest.php b/tests/Reader/CsvReaderTest.php index 42413464..f0a9e674 100644 --- a/tests/Reader/CsvReaderTest.php +++ b/tests/Reader/CsvReaderTest.php @@ -205,7 +205,7 @@ public function testDuplicateHeadersIncrement() $current = $reader->current(); $this->assertEquals( - array('id', 'description', 'description1', 'description2', 'details', 'details1', 'last'), + array('id', 'description', 'description1', 'description2', 'details', 'details1', 'last', 'UNKNOWN', 'UNKNOWN1'), $reader->getColumnHeaders() ); @@ -217,7 +217,9 @@ public function testDuplicateHeadersIncrement() 'description2' => 'Third', 'details' => 'Details1', 'details1' => 'Details2', - 'last' => 'Last one' + 'last' => 'Last one', + 'UNKNOWN' => 'empty1', + 'UNKNOWN1' => 'empty2' ), $current ); @@ -230,13 +232,14 @@ public function testDuplicateHeadersMerge() $reader->rewind(); $current = $reader->current(); - $this->assertCount(4, $reader->getColumnHeaders()); + $this->assertCount(5, $reader->getColumnHeaders()); $expected = array( 'id' => '50', 'description' => array('First', 'Second', 'Third'), 'details' => array('Details1', 'Details2'), - 'last' => 'Last one' + 'last' => 'Last one', + '' => array('empty1', 'empty2') ); $this->assertEquals($expected, $current); }