From 951fc68886e22f2ef0be987c67114b86da66e9cb Mon Sep 17 00:00:00 2001 From: Susann Sgorzaly Date: Mon, 26 Feb 2018 09:46:44 +0100 Subject: [PATCH 1/5] new feature: auto detect if parsed file has heading --- src/extensions/DatatypeTrait.php | 40 +++++++++++++++++++++++++++++++- tests/methods/ParseTest.php | 20 ++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/extensions/DatatypeTrait.php b/src/extensions/DatatypeTrait.php index 3e66405..0c4bdb2 100644 --- a/src/extensions/DatatypeTrait.php +++ b/src/extensions/DatatypeTrait.php @@ -2,6 +2,8 @@ namespace ParseCsv\extensions; +use ParseCsv\enums\DatatypeEnum; + trait DatatypeTrait { /** @@ -47,7 +49,7 @@ trait DatatypeTrait { * * @access public * - * @uses getDatatypeFromString + * @uses DatatypeEnum::getValidTypeFromSample * * @return array|bool */ @@ -71,4 +73,40 @@ trait DatatypeTrait { return !empty($this->data_types) ? $this->data_types : []; } + + /** + * Check data type of titles / first row for auto detecting if this could be + * a heading line. + * + * Requires PHP >= 5.5 + * + * @access public + * + * @uses DatatypeEnum::getValidTypeFromSample + * + * @return bool + */ + public function autoDetectFileHasHeading(){ + if (empty($this->data)){ + throw new \UnexpectedValueException('No data set yet.'); + } + + if ($this->heading){ + $firstRow = $this->titles; + } else { + $firstRow = $this->data[0]; + } + + if (empty(array_filter($firstRow))){ + return false; + } + + $firstRowDatatype = array_map('ParseCsv\enums\DatatypeEnum::getValidTypeFromSample', $firstRow); + + if ($this->getMostFrequentDatatypeForColumn($firstRowDatatype) !== DatatypeEnum::TYPE_STRING){ + return false; + } + + return true; + } } diff --git a/tests/methods/ParseTest.php b/tests/methods/ParseTest.php index 9566499..759565a 100644 --- a/tests/methods/ParseTest.php +++ b/tests/methods/ParseTest.php @@ -157,6 +157,26 @@ class ParseTest extends TestCase $this->assertEquals($expected, $this->csv->data_types); } + public function testAutoDetectFileHasHeading(){ + $this->csv->auto(__DIR__ . '/fixtures/datatype.csv'); + $this->assertTrue($this->csv->autoDetectFileHasHeading()); + + $this->csv->heading = false; + $this->csv->auto(__DIR__ . '/fixtures/datatype.csv'); + $this->assertTrue($this->csv->autoDetectFileHasHeading()); + + $this->csv->heading = false; + $sInput = "86545235689\r\n34365587654\r\n13469874576"; + $this->csv->auto($sInput); + $this->assertFalse($this->csv->autoDetectFileHasHeading()); + + $this->csv->heading = true; + $sInput = "86545235689\r\n34365587654\r\n13469874576"; + $this->csv->auto($sInput); + $this->assertFalse($this->csv->autoDetectFileHasHeading()); + + } + protected function _get_magazines_data() { return [ [ From 4bbc928f09ee72b67aa61303a9f5a7a17a904590 Mon Sep 17 00:00:00 2001 From: Susann Sgorzaly Date: Mon, 26 Feb 2018 10:00:52 +0100 Subject: [PATCH 2/5] added dependency for test --- tests/methods/ParseTest.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/methods/ParseTest.php b/tests/methods/ParseTest.php index 759565a..161ec29 100644 --- a/tests/methods/ParseTest.php +++ b/tests/methods/ParseTest.php @@ -157,6 +157,9 @@ class ParseTest extends TestCase $this->assertEquals($expected, $this->csv->data_types); } + /** + * @depends testSepRowAutoDetection + */ public function testAutoDetectFileHasHeading(){ $this->csv->auto(__DIR__ . '/fixtures/datatype.csv'); $this->assertTrue($this->csv->autoDetectFileHasHeading()); From 5b1002a6774d56338d41a174f32868ec41577e04 Mon Sep 17 00:00:00 2001 From: Susann Sgorzaly Date: Mon, 26 Feb 2018 10:06:59 +0100 Subject: [PATCH 3/5] test correction --- tests/methods/ParseTest.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/methods/ParseTest.php b/tests/methods/ParseTest.php index 161ec29..261f15b 100644 --- a/tests/methods/ParseTest.php +++ b/tests/methods/ParseTest.php @@ -161,6 +161,12 @@ class ParseTest extends TestCase * @depends testSepRowAutoDetection */ public function testAutoDetectFileHasHeading(){ + if (!function_exists('array_column')) { + // getDatatypes requires array_column, but that + // function is only available in PHP >= 5.5 + return; + } + $this->csv->auto(__DIR__ . '/fixtures/datatype.csv'); $this->assertTrue($this->csv->autoDetectFileHasHeading()); From fbe5263bca0baab99bc849af749b1e4434fc7e8f Mon Sep 17 00:00:00 2001 From: Susann Sgorzaly Date: Tue, 27 Feb 2018 13:22:11 +0100 Subject: [PATCH 4/5] only code improvements --- src/extensions/DatatypeTrait.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/extensions/DatatypeTrait.php b/src/extensions/DatatypeTrait.php index 0c4bdb2..de9d92d 100644 --- a/src/extensions/DatatypeTrait.php +++ b/src/extensions/DatatypeTrait.php @@ -97,7 +97,8 @@ trait DatatypeTrait { $firstRow = $this->data[0]; } - if (empty(array_filter($firstRow))){ + $firstRow = array_filter($firstRow); + if (empty($firstRow)){ return false; } From fb9325884d8c81d95f4d39d5bcce4675bb5259c3 Mon Sep 17 00:00:00 2001 From: Susann Sgorzaly Date: Wed, 28 Feb 2018 13:47:38 +0100 Subject: [PATCH 5/5] small code improvement --- src/extensions/DatatypeTrait.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/extensions/DatatypeTrait.php b/src/extensions/DatatypeTrait.php index de9d92d..475fc40 100644 --- a/src/extensions/DatatypeTrait.php +++ b/src/extensions/DatatypeTrait.php @@ -64,7 +64,7 @@ trait DatatypeTrait { $result = []; foreach ($this->titles as $cName) { $column = array_column($this->data, $cName); - $cDatatypes = array_map('ParseCsv\enums\DatatypeEnum::getValidTypeFromSample', $column); + $cDatatypes = array_map(DatatypeEnum::class . '::getValidTypeFromSample', $column); $result[$cName] = $this->getMostFrequentDatatypeForColumn($cDatatypes); } @@ -102,7 +102,7 @@ trait DatatypeTrait { return false; } - $firstRowDatatype = array_map('ParseCsv\enums\DatatypeEnum::getValidTypeFromSample', $firstRow); + $firstRowDatatype = array_map(DatatypeEnum::class . '::getValidTypeFromSample', $firstRow); if ($this->getMostFrequentDatatypeForColumn($firstRowDatatype) !== DatatypeEnum::TYPE_STRING){ return false;