Hier mal ein schneller Tipp. Ich habe ein CLI Skript in PHP programmiert. Dabei habe ich Daten über eine REST API abgefragt und wollte diese schnell und unkompliziert in CSV umwandeln und im Terminal (stdout) ausgeben. Das geht zum Glück ganz einfach mit PHP-Hausmittel.

fopen und fputcsv

Gegeben ist ein Array mit Daten. In meinem Fall habe ich sogar ein Array von Array und jedes Sub-Array soll eine CSV Zeile ergeben.

PHP bringt die Funktion fputcsv (php.net) mit und damit kann man Array Daten als CSV einem Stream übergeben. Damit können wir Daten direkt in eine Datei schreiben (falls es ein Datei-Stream wäre) oder in meinem Fall einfach stdout verwenden und die Daten auf dem Bildschirm durcken. Dazu öffne ich den Stream mittels fopen("php://stdout", "") (php.net). Der zweite Parameter hier muss gesetzt werden, wird bei stdout aber ignoriert, daher übergebe ich nur einen leeren String.

Damit iterieren wir nun über das Array, picken uns die Informationen heraus, die ich benötige (im Prinzip ist es ein map-Vorgang) und übergebe sie mit dem Stream an die Funktion fputcsv.

Am Schluss noch den Stream schließen und fertig ist die Kiste.

<?php

function toCsv(): void {
    // Array of Arrays
    $data = [[...], [...], [...]];
    
    // Stream öffnen: Hier der stdout, um die Daten auf den Bildschirm anzuzeigen
    $stdout = fopen("php://stdout", "");
    
    foreach ($data as $line) {
        $values = [
            'datum'          => $line['date'],
            'empfänger'      => $line['name'],
            'verbucht'       => '1'
        ];

        fputcsv($stdout, $values);
    }

    // Stream schließen nicht vergessen.
    fclose($stdout);
}

Warum überhaupt fputcsv?

Könnte an die Array-Daten nicht einfach mit einem `implode` (php.net) auch in eine CSV Zeile konvertieren? Im Grunde muss ich die Daten ja nur mit einem Komma trennen und zu einem String verwandeln?

Das ist im Kerngedanken richtig, aber es gibt ein Problem: Escaping. Wenn in einem Wert ein Komma oder andere Werte vorkommen, die escaped werden müssen, dann würde dieser Ansatz zu Fehlern führen. Mittels fputcsv müssen wir uns darum keine Gedanken machen. Werte werden mit “ (Anführungszeichen) als ein Wert markiert und Werte werden richtig escaped. So bekommen wir am Schluss ein valides CSV.

Veröffentlicht von Hans-Helge

Der studierte Informatiker arbeitet als Entwickler und Trainer bei ChurchTools und betreut neben eigenen Projekten einige andere Webseiten u.A. im ehrenamtlichen Bereich.

Beteilige dich an der Unterhaltung

3 Kommentare

  1. Sehr hilfreicher Artikel! Ich schätze es, wenn Entwickler ihre „kleinen Entdeckungen“ teilen, die den Entwicklungsprozess beschleunigen und verbessern können. Besonders der Hinweis auf das Escaping mit fputcsv im Vergleich zu implode ist wertvoll – manchmal sind es genau diese kleinen Details, die Stunden der Fehlerbehebung sparen können. Für alle, die viel mit Daten arbeiten und diese in unterschiedlichen Formaten exportieren müssen, ist dieser Tipp Gold wert. Vielen Dank fürs Teilen!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert