From b702b45cbbead760212b991205f5e0b4d372be46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven=20Bu=CC=88hner?= Date: Tue, 7 Jun 2016 10:55:17 +0200 Subject: [PATCH 1/3] BUGFIX: the column-name does not fit to the result anymore when using the CSVReader with the option $this->setHeaderRowNumber ( 0, CsvReader::DUPLICATE_HEADERS_INCREMENT ); --- src/Reader/CsvReader.php | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/Reader/CsvReader.php b/src/Reader/CsvReader.php index f269b63b..063be2e2 100644 --- a/src/Reader/CsvReader.php +++ b/src/Reader/CsvReader.php @@ -365,19 +365,24 @@ protected function readHeaderRow($rowNumber) */ protected function incrementHeaders(array $headers) { - $incrementedHeaders = []; - foreach (array_count_values($headers) as $header => $count) { + $incrementedHeaders = array(); + + // 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' : ''; + $headers [$key] = $prefix . $headerName . $incrementedHeaders [$headerName] ++; + } + } + + return $headers; } /** From ef8e05181a3957ffe25f9fd1cc82b47e90fe0c0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven=20Bu=CC=88hner?= Date: Tue, 7 Jun 2016 11:35:37 +0200 Subject: [PATCH 2/3] Update CSVReader to stay compatible with tests --- src/Reader/CsvReader.php | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/Reader/CsvReader.php b/src/Reader/CsvReader.php index 063be2e2..32870f91 100644 --- a/src/Reader/CsvReader.php +++ b/src/Reader/CsvReader.php @@ -365,7 +365,7 @@ protected function readHeaderRow($rowNumber) */ protected function incrementHeaders(array $headers) { - $incrementedHeaders = array(); + $incrementedHeaders = [ ]; // Get all headlines that are duplicate or more foreach ( array_count_values ( $headers ) as $header => $count ) { @@ -375,10 +375,16 @@ protected function incrementHeaders(array $headers) } // 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' : ''; - $headers [$key] = $prefix . $headerName . $incrementedHeaders [$headerName] ++; + 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; } } From d4ae0036334cb3f8123bfd4ca8087edd6baa6006 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven=20Bu=CC=88hner?= Date: Tue, 7 Jun 2016 11:43:43 +0200 Subject: [PATCH 3/3] I added two more EMPTY colums, to test the newly added UNKNOWN Column-Name. (Which is incremented on multiple usage) --- tests/Fixtures/data_column_headers_duplicates.csv | 4 ++-- tests/Reader/CsvReaderTest.php | 11 +++++++---- 2 files changed, 9 insertions(+), 6 deletions(-) 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); }