diff --git a/src/DataSource/Interpreter/CsvFileInterpreter.php b/src/DataSource/Interpreter/CsvFileInterpreter.php index 6aaba358..81bae528 100644 --- a/src/DataSource/Interpreter/CsvFileInterpreter.php +++ b/src/DataSource/Interpreter/CsvFileInterpreter.php @@ -20,6 +20,8 @@ class CsvFileInterpreter extends AbstractInterpreter { + private const UTF8_BOM = "\xEF\xBB\xBF"; + /** * @var bool */ @@ -43,6 +45,8 @@ class CsvFileInterpreter extends AbstractInterpreter protected function doInterpretFileAndCallProcessRow(string $path): void { if (($handle = fopen($path, 'r')) !== false) { + $this->skipByteOrderMark($handle); + if ($this->skipFirstRow) { //load first row and ignore it $data = fgetcsv($handle, 0, $this->delimiter, $this->enclosure, $this->escape); @@ -88,6 +92,8 @@ public function previewData(string $path, int $recordNumber = 0, array $mappedCo $readRecordNumber = -1; if ($this->fileValid($path) && ($handle = fopen($path, 'r')) !== false) { + $this->skipByteOrderMark($handle); + if ($this->skipFirstRow) { //load first row and ignore it $data = fgetcsv($handle, 0, $this->delimiter, $this->enclosure, $this->escape); @@ -127,4 +133,11 @@ public function previewData(string $path, int $recordNumber = 0, array $mappedCo return new PreviewData($columns, $previewData, $readRecordNumber, $mappedColumns); } + private function skipByteOrderMark($handle): void + { + $bom = fread($handle, strlen(self::UTF8_BOM)); + if (0 !== strncmp(self::UTF8_BOM, $bom, strlen(self::UTF8_BOM))) { + rewind($handle); + } + } } diff --git a/tests/bin/docker-compose.yml b/tests/bin/docker-compose.yml index 7263c024..2f5c046e 100644 --- a/tests/bin/docker-compose.yml +++ b/tests/bin/docker-compose.yml @@ -22,7 +22,7 @@ services: PIMCORE_TEST: 1 PIMCORE_TEST_DB_DSN: "mysql://pimcore:pimcore@db:3306/pimcore_test" depends_on: - - db + - db volumes: - ../../.:/var/www/html - /var/www/html/vendor