outputFile = $outputFile; $this->delimiter = $csvStructure['outputDelimiter'] ?? ','; } /** * Schreibt Daten in CSV-Datei * * @param array $data Array von assoziativen Arrays (Zeilen) * @throws \RuntimeException wenn Datei nicht geschrieben werden kann */ public function write(array $data): void { if (empty($data)) { throw new \RuntimeException("Keine Daten zum Schreiben"); } // Output-Verzeichnis erstellen falls nicht vorhanden $dir = dirname($this->outputFile); if (!is_dir($dir)) { if (!mkdir($dir, 0755, true)) { throw new \RuntimeException("Konnte Output-Verzeichnis nicht erstellen: {$dir}"); } } $fp = fopen($this->outputFile, 'w'); if ($fp === false) { throw new \RuntimeException("Konnte Output-Datei nicht erstellen: {$this->outputFile}"); } try { // Headers schreiben (Spalten-Namen aus erster Zeile) $headers = array_keys($data[0]); $this->writeCsvLine($fp, $headers); // Datenzeilen schreiben foreach ($data as $row) { // Sicherstellen dass alle Spalten vorhanden sind $values = []; foreach ($headers as $header) { $values[] = $row[$header] ?? ''; } $this->writeCsvLine($fp, $values); } } finally { fclose($fp); } } /** * Schreibt eine CSV-Zeile mit fputcsv * * @param resource $fp File-Handle * @param array $values Array mit Werten * @throws \RuntimeException wenn Schreiben fehlschlägt */ private function writeCsvLine($fp, array $values): void { $result = fputcsv($fp, $values, $this->delimiter, '"', '\\'); if ($result === false) { throw new \RuntimeException("Fehler beim Schreiben der CSV-Zeile"); } } /** * Gibt den Pfad zur Output-Datei zurück * * @return string Output-Dateipfad */ public function getOutputFile(): string { return $this->outputFile; } /** * Prüft ob Output-Datei erstellt wurde * * @return bool True wenn Datei existiert */ public function fileExists(): bool { return file_exists($this->outputFile); } /** * Gibt die Größe der Output-Datei zurück * * @return int|false Dateigröße in Bytes oder false bei Fehler */ public function getFileSize(): int|false { if (!$this->fileExists()) { return false; } return filesize($this->outputFile); } }