mirror of
https://github.com/Codappix/typo3-php-datasets.git
synced 2024-11-10 23:36:15 +01:00
99 lines
3 KiB
PHP
99 lines
3 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
/*
|
|
* Copyright (C) 2023 Daniel Siepmann <coding@daniel-siepmann.de>
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
* 02110-1301, USA.
|
|
*/
|
|
|
|
namespace Codappix\Typo3PhpDatasets\Converter;
|
|
|
|
use InvalidArgumentException;
|
|
use SplFileObject;
|
|
|
|
class Csv implements Converter
|
|
{
|
|
public function convert(string $fileName): string
|
|
{
|
|
if (file_exists($fileName) === false) {
|
|
throw new InvalidArgumentException('Given file "' . $fileName . '" does not exist.', 1681283739);
|
|
}
|
|
|
|
$phpFileName = $this->getNewFileName($fileName);
|
|
$incomingFile = new SplFileObject($fileName);
|
|
|
|
try {
|
|
file_put_contents($phpFileName, $this->buildContent($incomingFile));
|
|
} catch (\Exception $e) {
|
|
throw new \Exception('Could not generate new file.', 1681287881, $e);
|
|
}
|
|
|
|
return $phpFileName;
|
|
}
|
|
|
|
private function getNewFileName(string $fileName): string
|
|
{
|
|
$file = new SplFileObject($fileName);
|
|
return str_replace(
|
|
$file->getBasename(),
|
|
$file->getBasename($file->getExtension()) . 'php',
|
|
$file->getRealPath()
|
|
);
|
|
}
|
|
|
|
private function buildContent(SplFileObject $incomingFile): string
|
|
{
|
|
$phpArray = [];
|
|
$tableName = '';
|
|
$columns = [];
|
|
|
|
$incomingFile->setFlags(SplFileObject::READ_CSV);
|
|
$incomingFile->setCsvControl(',', '"', '"');
|
|
|
|
foreach ($incomingFile as $line) {
|
|
if (is_array($line) && count($line) === 1 && is_null($line[0])) {
|
|
// End of file
|
|
break;
|
|
}
|
|
|
|
if (is_array($line) && count(array_filter($line)) === 1 && is_string($line[0])) {
|
|
// Line is a new table, introducing also new columns o next row
|
|
$tableName = $line[0];
|
|
$columns = [];
|
|
continue;
|
|
}
|
|
|
|
if ($columns === [] && is_array($line)) {
|
|
$columns = array_filter($line);
|
|
continue;
|
|
}
|
|
|
|
if (is_array($line)) {
|
|
$values = array_slice($line, 1, count($columns));
|
|
$phpArray[$tableName][] = array_combine($columns, $values);
|
|
}
|
|
}
|
|
|
|
return implode(PHP_EOL, [
|
|
'<?php',
|
|
'',
|
|
'return ' . var_export($phpArray, true) . ';',
|
|
'',
|
|
]);
|
|
}
|
|
}
|