Falconbyte unterstüzen
Betrieb und Pflege von Falconbyte brauchen viel Zeit und Geld. Um dir auch weiterhin hochwertigen Content anbieten zu können, kannst du uns sehr gerne mit einem kleinen "Trinkgeld" unterstützen.
Schnelles Code-Beispiel:
<?php
$daten = array('Wert1', 'Wert2', 'Wert3', 'Wert4', 'Wert5');
$fp = fopen('daten.csv', 'a');
fputcsv($fp, $daten);
fclose($fp);
?>
Was sind CSV-Dateien überhaupt?
CSV steht für Comma-separated values, also "durch Kommata getrennte Werte". Es muss aber nicht immer ein Komma sein: Strichpunkt, Doppelpunkt oder ein anderes Zeichen sind auch möglich.
CSV-Dateien sind einfache Textdateien, in denen Tabellen abgebildet werden. Besonders häufig werden CSV-Dateien in Tabellenkalukations-Anwendung (z.B. Excel) oder Datenbanken für den Datenimport bzw. -export eingesetzt.Ein konkretes Beispiel:
Wir haben in einer EXCEL-Datenbank eine Tabelle mit Kundendaten. Das könnte vereinfacht so aussehen:
Wenn wir diese Tabelle in EXCEL als CSV-Datei speichern, erhalten wir eine Reintext-Datei mit der Endung .csv. Der Inhalt dieser Datei stellt sich dann so dar:
Name;Vorname;Wohnort;KundenNummer
Picard;Jean-Luc;Sternenflotte;1234
Reddington;Red;unbekannt;4545
Dexter;Morgan;Miami;6666
Die einzelnen Daten sind hier mittels Semikolon getrennt und jeder Datensatz ist eine Zeile.
Soviel zur Theorie. Sehen wir uns nun an, wie wir CSV-Dateien mit PHP erstellen und auslesen können.
Datenreihe in CSV-Datei schreiben
Sehen wir uns zunächst noch einmal das Code-Beispiel von oben an: .
<?php
$daten = array('Wert1', 'Wert2', 'Wert3', 'Wert4', 'Wert5');
$fp = fopen('daten.csv', 'a');
fputcsv($fp, $daten);
fclose($fp);
?>
Als erstes suchen wir uns in PHP die Daten heraus, die wir in die CSV-Datei schreiben wollen. Genauer gesagt: Wir legen uns ein Array mit Daten zurecht ($daten).
Jetzt lassen wir uns mithilfe der Funktion fopen eden Dateizeiger zurückgeben und speichern diesen in einer Variablen ($fp).
fopen benötigt zwei Parameter: Der erste Parameter verlangt den Dateinamen der CSV-Datei. Der zweite Parameter beschreibt den Zugriffstyp des Streams. Setzen wir "w" ein, heißt das, dass falls die Datei schon exisitiert, der Inhalt überschreiben wird. Wollen wir aber Daten ans Ende einer schon bestehenden CSV-Datei anhängen, sollten wir "a" als Argument übergeben. In beiden Fällen wird die Datei neu erstellt, wenn sie noch nicht exisitiert.
Jetzt starten wir die Funktion fputcsv und übergeben der Funktion den Dateizeiger ($fp) und das Array ($daten). Damit schreiben wir eine Zeile in der CSV-Datei.
Am Ende schließen wir die mit fclose wieder.
Beim Ausführen des Programms erhalten wir die gewünschte Datei daten.csv mit folgendem Inhalt:
Wert1,Wert2,Wert3,Wert4,Wert5
Zugriffsrechte richtig auswählen
Unter Umständen erhalten Sie beim Starten folgende Fehlermeldung: Warning: fopen(daten.csv): failed to open stream: Permission denied in....
Das heißt, dass der Schreibzugriff verweigert wurde. Wenn das der Fall ist, müssen Sie die Zugriffsrechte des Ordners/ Verzeichnisses, in dem die CSV-Datei geschrieben wird, anpassen:
Bei Mac: Rechtsklick auf den Ordner > Informationen > Zugriffsrechte (unten) > Lesen & Schreiben für alle
Bei Windows: Rechtsklick auf den Ordner > Properties > Security
Mehrere Datenreihen in CSV-Datei schreiben
Eine einzelne Zeile zu erzeugen ist meist aber nicht genug. Um mehre Datenreihen bzw. Zeilen in der CSV-Datei zu speichern, benötigen wir mehrere Arrays. Jedes Array wird einmal mit fputcsv ausgeführt:
<?php
$daten = array(
array('aaa', 'bbb', 'ccc', 'ddd', 'eee'),
array('111', '222', '333', '444', '555'),
array('AAA', 'BBB', 'CCC', 'DDD', 'EEE')
);
$fp = fopen('daten.csv', 'w');
foreach($daten as $arrays){
fputcsv($fp, $arrays);
}
fclose($fp);
?>
Wir haben die Daten in einem zweidimensionalen Array angeordnet und lassen die einzelnen Arrays in einer foreach-Schleife mit der Funktion fputcsv durchlaufen.
So erhalten wir in der CSV-Datei folgenden Inhalt:
aaa,bbb,ccc,ddd,eee
111,222,333,444,555
AAA,BBB,CCC,DDD,EEE
Einfaches auslesen
Um den Inhalt einer CSV-Datei einfach auszulesen und am Bildschirm anzeigen zu lassen, verwenden wir fgetcsv() in Kombination mit einer while-Schleife und der Funktion feof():
$file = fopen("daten.csv","r");
while(! feof($file))
{
print_r(fgetcsv($file));
echo "<br>";
}
fclose($file);
Die Funktion feof() prüft, ob das Ende der CSV-Datei erreicht ist. Falls dem so ist, wird true zurückgeliefert (ansonsten false).
Innerhalb der Schleife arbeiten wir nun mit der Funktion fgetcsv() und übergeben das Datei-Handle als Parameter. fgetcsv() liest immer genau eine Zeile aus der CSV-Datei und gibt den Wert als String zurück. Diese Zeile geben wir mit print_r() am Bildschirm aus. Danach springt der Dateizeiger zur nächsten Zeile.
Nun wird der Grund für die Einbindung in eine while-Schleife deutlich: fgetcsv() soll nämlich solange ausgeführt werden, bis das Ende der Datei erreicht ist.
Im Browserfenster erhalten wir somit alle Datenreihen der CSV angezeigt:
Array ( [0] => aaa [1] => bbb [2] => ccc [3] => ddd [4] => eee )Array ( [0] => 111 [1] => 222 [2] => 333 [3] => 444 [4] => 555 )
Array ( [0] => AAA [1] => BBB [2] => CCC [3] => DDD [4] => EEE )
Mit CSV-Daten weiterarbeiten
Zum reinen Anzeigenlassen der CSV-Daten ist dieser Weg in Ordnung. Wie gehen wir aber vor, wenn wir die Datenreihen der CSV-Datei mit PHP weiterverarbeiten wollen?
Eine Verarbeitung der Daten aus der CSV ist dann möglich, wenn wir die einzelnen Zeilen in einem zweidimensionalen Array speichern.
Auch hierz nutzen wir wieder die Funktion fgetcsv() in Kombination mit feof() und einer while-Schleife:
$index = 0;
$file = fopen('daten.csv', 'r');
while(! feof($file))
{
$array[$index] = fgetcsv($file); // Speichert CSV-Zeile in Array
$index++;
}
fclose($file);
Jeder Schleifendurchlauf liefert die einzelnen Daten einer CSV-Zeile als Array zurück. Jedes Array repräsentiert also eine CSV-Zeile. Die einzelnen Arrays werden wiederum in einem übergeordnetem Array gespeichert.
Nun können wir in PHP auf die importieren Datensätze der CSV-Datei bequem über die Indices des Arrays zugreifen:
for($i = 0; $i < count($array); $i++){
for($y = 0; $y < count($array[$i]); $y++) {
echo $array[$i][$y] . " ";
}
echo "<br>";
}
aaa bbb ccc ddd eee 111 222 333 444 555
AAA BBB CCC DDD EEE