diff --git a/src/extensions/DatatypeTrait.php b/src/extensions/DatatypeTrait.php index 3e66405..475fc40 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 */ @@ -62,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); } @@ -71,4 +73,41 @@ 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]; + } + + $firstRow = array_filter($firstRow); + if (empty($firstRow)){ + return false; + } + + $firstRowDatatype = array_map(DatatypeEnum::class . '::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 f6cfb05..ee88165 100644 --- a/tests/methods/ParseTest.php +++ b/tests/methods/ParseTest.php @@ -179,6 +179,35 @@ class ParseTest extends TestCase { $this->assertEquals($expected, array_keys($this->csv->data[0])); } + /** + * @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()); + + $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 [ [