Teren-app/app/Services/CsvImportService.php
Simon Pocrnjič 7227c888d4 Mager updated
2025-09-27 17:45:55 +02:00

66 lines
1.7 KiB
PHP

<?php
namespace App\Services;
class CsvImportService
{
/**
* Read the first line of a file; returns null on failure.
*/
public function readFirstLine(string $path): ?string
{
$fh = @fopen($path, 'r');
if (!$fh) return null;
$line = fgets($fh);
fclose($fh);
return $line === false ? null : $line;
}
/**
* Detect delimiter and return columns for first row.
* If $hasHeader is false, returns positional indices instead of header names.
* Returns [delimiter, columns].
*/
public function detectColumnsFromCsv(string $path, bool $hasHeader): array
{
// Use actual tab character for TSV; keep other common delimiters
$delims = [',',';','|',"\t"];
$bestDelim = ',';
$bestCols = [];
$firstLine = $this->readFirstLine($path);
if ($firstLine === null) {
return [$bestDelim, []];
}
$maxCount = 0;
foreach ($delims as $d) {
$row = str_getcsv($firstLine, $d);
$count = is_array($row) ? count($row) : 0;
if ($count > $maxCount) {
$maxCount = $count;
$bestDelim = $d;
$bestCols = $row;
}
}
if (!$hasHeader) {
// return positional indices 0..N-1
$cols = [];
for ($i = 0; $i < $maxCount; $i++) {
$cols[] = (string) $i;
}
return [$bestDelim, $cols];
}
// Clean header names
$clean = array_map(function ($v) {
$v = trim((string) $v);
$v = preg_replace('/\s+/', ' ', $v);
return $v;
}, $bestCols);
return [$bestDelim, $clean];
}
}