Lerne Coding
CSV-Dateien mit PHP erstellen und lesen!
10.12.2019

Mit CSV-Dateien arbeiten in PHP! Lesen & schreiben!

Inhaltsverzeichnis
[[TABLE OF CONTENTS]]
access_timeGeschätzte Lesezeit ca. Minuten

In diesem Artikel beschäftigen wir uns damit, wie wir in PHP mit CSV-Dateien arbeiten können. Sowohl das Lesen als auch das Schreiben haben in PHP eigene Funktionen für CSV-Dateien.

Ich habe euch zwei Beispiele mitgebracht: Einmal für das Lesen einer CSV-Datei als Array mit Feldbezeichnung. Und des Weiteren für das Schreiben mit Kopfzeile.

In Python geht das natürlich auch das zeige ich dir hier: In Python CSV-Dateien erstellen und lesen

Was sind CSV-Dateien überhaupt?

CSV steht für comma-separated values oder auch für character-separated values. Letzteres finde ich persönlich passender, da auch andere Separatoren verwendet werden.

Eine CSV-Datei repräsentiert immer eine Tabelle, aus diesem Grund haben CSV-Datein auch immer eine Kopfzeile mit der Bezeichnung der Spalte. Ein häufiger Verwendungszweck für CSV-Dateien ist der Export und Import von Daten in Tabellenkalkulationsanwendungen. Ein bekanntes Beispiel hierfür ist Excel. Ein anderer Anwendungsbereich ist zum Beispiel der Produktexport oder -import bei Woocommerce-Shop-Produkten. Dort repräsentiert dann eine Zeile ein Produkt.

Eine CSV-Datei, die mittels PHP erstellt wurde, kann zum Beispiel den folgenden Inhalt haben:

Produkt,"Im Lager",Preis,Produkt-ID
Tastatur,1,"5,50",90-120
Lampe,,"6,70",91-120
Tastatur,1,"5,50",90-120
Lampe,,"6,70",91-120

Was hier auffällt: Sobald sich ein Komma oder eine Leerstelle in einem Feld befindet, wird der Wert in Anführungszeichen gesetzt. Bei Feldern, die zum Beispiel "False" sind, wird gar nichts eingetragen!

Hier noch einmal eine Infografik, die zeigt wie es aussieht, wenn eine Tabelle durch eine CSV-Datei repräsentiert wird.

Schreiben von CSV-Dateien in PHP

Als erstes habe ich euch ein Beispiel für das Schreiben von CSV-Dateien mitgebracht. In dem Beispiel wurde als erstes geprüft, ob die Datei existiert oder eben nicht.

Mit der Funktion file_exists() kannst du prüfen, ob die Datei im Verzeichnis existiert. Du kannst auch noch einen Pfad angeben, wenn du in einem Unterverzeichnis nach der Datei schauen willst.

Wenn sie bereits existiert, öffnen wir die Datei im "a" Mode. Das steht für "Append". Also können wir neue Spalten zu einer bestehenden CSV-Datei ergänzen. Eine Alternative wäre, als erstes eine erste Zeile definieren zu lassen, falls die Datei noch nicht existieren sollte. Diese Spalte enthält die Bezeichnungen für die einzelnen Spalten als Array. Zu beachten ist, dass ein Array ohne Mehrdimensionalität immer einer Zeile entspricht.

Durch die Funktion fputcsv(DateiStream,Zeile) wird eine neue Zeile in die Datei geschrieben. $csvFile ist unser geöffneter Stream zur Datei, die wir mit der Zeile $head beschreiben, wenn es eine neue Datei ist.

Darunter definieren wir unseren Array $data. Dieser enthält zwei Zeilen; einmal für das Produkt "Tastatur" und einmal für die "Lampe".

Durch eine Schleife schreiben wir nun alle Zeilen mittels PHP in die CSV-Datei.


<?php

$fileName = 'produkte.csv';

if(file_exists($fileName)):
    $csvFile = fopen($fileName,'a');
else:
    $csvFile = fopen($fileName,'w');
    $head = ["Produkt","Im Lager","Preis","Produkt-ID"];
    fputcsv($csvFile,$head);
endif;

$data = [
    ["Tastatur",true,"5,50","90-120"],
    ["Lampe",false,"6,70","91-120"]
];

foreach($data as $row){
    fputcsv($csvFile,$row);
}

fclose($csvFile);

?>

Am Ende ist es wichtig, mittels fclose die CSV-Datei wieder zu schließen. Ansonsten kann es zu Fehlern kommen, sobald zu viele Dateien gleichzeitig geöffnet sind.

Zu beachten ist außerdem, dass die Felde immer der Anzahl der Felder in der ersten Spalte entsprechen sollten, da es sonst bei einem späteren Lesen der CSV-Datei gegebenenfalls zu Komplikationen kommen kann.

Als erste Spalte die Bezeichnungen, für die Spalten danach folgen die Inhalte der Produkte.

Unsere CSV-Datei aus dem obigen Code wird den folgenden Inhalt haben:

Produkt,"Im Lager",Preis,Produkt-ID
Tastatur,1,"5,50",90-120
Lampe,,"6,70",91-120

Lesen von CSV-Dateien in PHP

Natürlich kannst du mit PHP nicht nur CSV-Dateien schreiben, sondern auch auslesen. Das möchte ich hier einmal beschreiben. In dem Beispiel gehe ich davon aus, dass eine Kopfzeile mit Bezeichnungen existiert und dass die einzelnen Zeilen nicht mehr Felder haben als die Kopfzeile.

In dem Beispiel erstellen wir aus der Tabelle ein mehrdimensionales Array. Eine Zeile ist ein Array im Array. Das folgende Beispiel zeigt das etwas besser.

array(2) {
    [0]=>
        array(4) {
            ["Produkt"]=>
            string(8) "Tastatur"
            ["Im Lager"]=>
            string(1) "1"
            ["Preis"]=>
            string(4) "5,50"
            ["Produkt-ID"]=>
            string(6) "90-120"
        }
    [1]=>
        array(4) {
            ["Produkt"]=>
            string(5) "Lampe"
            ["Im Lager"]=>
            string(0) ""
            ["Preis"]=>
            string(4) "6,70"
            ["Produkt-ID"]=>
            string(6) "91-120"
        }
}

Wir Ordnen jedem Key immer einen Value zu. So können wir von jeder Zeile direkt auf den Preis oder die Produkt-ID zugreifen. So haben wir es einfacher, auf die Elemente zuzugreifen. Wenn wir wissen, dass die Produkt-ID eindeutig ist, können wir auch statt 0 und 1 jeweils die Produkt-ID als Key nehmen. So kann man noch schneller auf bestimmte Produkte zugreifen.

Natürlich kannst du dir auch einfach ein Array mit Zahlen als Key schreiben, je nach dem, wie du es für deine Anwendung verwenden willst.

<?php
$fileName = 'produkte.csv';
$keys = [];
$tableArray = [];

if(file_exists($fileName) && ($csvFile = fopen($fileName,"r")) !== false){
    $i = 0;
    while(($row = fgetcsv($csvFile, 0,",")) !== false){
        if($i === 0){
            foreach($row as $item){
                $keys[] = $item;
            }
        }else{
            $number = count($row);
            $rowClean = [];
            for ($i=0; $i < $number; $i++) { 
            $rowClean[$keys[$i]] = trim($row[$i]);
            }
            $tableArray[] = $rowClean;
        }
        $i++;
    }
}

var_dump($tableArray);
?>

Wie gehen wir vor?

Als erstes prüfen wir, ob die Datei existiert. Danach prüfen wir, ob wir die Datei öffnen können; in diesem Fall öffnen wir sie im "r"-Modus. Dadurch können wir nur lesen, aber nicht schreiben.

Anschließend öffnen wir mittels fgetcsv die CSV selbst und greifen nun in einer While-Schleife auf die einzelnen Rows zu. Als ersten Parameter erwartet die Funktion einen Datenstream zur CSV-Datei, danach folgt die Länge einer Zeile. Setzen wir diesen auf 0, ist die theoretische Zeilenlänge unendlich. Als letzten Parameter können wir noch den Seperator definieren, falls wir nicht mit dem Default Komma "," gearbeitet haben.

Jetzt, da wir wissen, dass unsere erste Spalte die Kopfzeile ist, sammeln wir uns erst einmal die Spaltenbezeichnungen ein. Danach ordnen wir die einzelnen Werte dem Spaltennamen zu. Die gruppierten Spalten werden im tableArray geschrieben, sodass wir danach auf die Werte zugreifen können.

Wichtig ist, dass wir mittels fgetcsv auf die Werte zugreifen. Wie genau du die Auswertung der Zeilen vornehmen willst, ist dir überlassen, für saubere CSV-Dateien mit einer Kopfspalte wird diese Variante problemlos funktionieren.

Kommentare zum Artikel
Alexander schreibt ... Kommentar vom 12.02.2022
Danke

Danke für diesen Artikel, ich habe 2 Tage gegoogelt und nichts gefunden was mir weiterhilft .csv Dateien vernünfigt zu importieren. Dieser Artikel hat mir die Lösung gebracht :)

Antworten
Alexander
Kommentar schreiben

Verwante Beiträge
close