Funktion fgetcsv() - CSV-Datei auslesen

Häufig werden große Datenmengen in Tabellenkalkulations-Programmen wie z.B. Excel verwaltet. Die Kalkulationsmappen können jedoch nicht einfach verwendet werden, wenn man die Daten in einer PHP-Anwendung nutzen möchte. Es gibt die Möglichkeit, die Kalkulationsmappen als CSV-Dateien zu exportieren. Man erhält dadurch eine Textdatei, in der die Daten mit einem Komma getrennt (oder einem anderen Trennzeichen) bereitgestellt werden. Die CSV-Datei kann man danach hochladen und dadurch z.B. eine Datenbank aktualisieren. Das erspart eine erneute Eingabe.

Um in PHP eine CSV-Datei einzulesen, kann man die Funktion fgetcsv() verwenden. Die einzelnen Werte innerhalb der CSV-Datei werden in einem indizierten Array gespeichert und können weiter verarbeitet werden. Innerhalb der runden Klammern können die folgenden Parameter angegeben werden.

  1. Der Dateizeiger für die CSV-Datei (handle).
  2. Maximale Länge einer Zeile (length, optional ab PHP 5.0).
  3. Das Trennzeichen (delimiter, optional, nur ein Zeichen, standardmäßig ein Komma).
  4. Textmarkierungszeichen (enclosure, optional, nur ein Zeichen, standardmäßig ein Anführungszeichen).
  5. Maskierungszeichen (escape, optional, nur ein Zeichen, standardmäßig ein Backslash).

Einen Dateizeiger erhält man, wenn man eine Datei mit der Funktion fopen(), popen() oder fsockopen() öffnet und den Rückgabewert in einer Variable speichert. Beim folgenden Beispiel wird datei.csv mit fopen() geöffnet. Die Variable $handle ist somit der Dateizeiger und wird als Parameter der Funktion fgetcsv() verwendet.

Damit die Funktion fgetcsv() auf alle Zeilen der CSV-Datei angewendet wird, wird eine while-Schleife verwendet. Der Rückgabewert wird im Array $csv_array gespeichert. In der while-Schleife wird wiederum eine foreach-Schleife verwendet, um die einzelnen Werte von $csv_array auszugeben. Zum Schluss wird mit der Funktion fclose() die CSV-Datei wieder geschlossen.

<?php

// Datei öffnen, $handle ist der Dateizeiger
$handle = fopen ('datei.csv','r');

// Datei zeilenweise auslesen, fgetcsv() anwenden, im Array $csv_array speichern
while (($csv_array = fgetcsv ($handle)) !== FALSE ) {

  // Ausgeben des Arrays $csv_array
  foreach ($csv_array as $index) {
    echo $index . '<br>';
  }
}

// Datei schließen
fclose($handle);

?>

Zeilenlänge angeben

Wenn man bei der Funktion fgetcsv() den zweiten Parameter für die Zeilenlänge nicht angibt, ist der Vorgang etwas langsamer als mit der Angabe. Damit der Vorgang etwas beschleunigt wird, kann man die maximale Zeilenlänge angeben. Der Wert sollte größer sein als die längste Zeile in der CSV-Datei, damit die Zeilen auch komplett ausgelesen werden. Beim folgenden Beispiel wurde der Parameter auf 1000 gesetzt.

<?php

$handle = fopen ('datei.csv','r');

while (($csv_array = fgetcsv ($handle, 1000)) !== FALSE ) {

  foreach ($csv_array as $index) {
    echo $index . '<br>';
  }
}

fclose($handle);

?>

Trennzeichen (delimiter) angeben

Nicht immer wird in CSV-Dateien ein Komma als Trennzeichen verwendet. Üblich ist z.B. auch ein Semikolon. In solchen Fällen kann man als dritten Parameter das Trennzeichen selbst angeben.

<?php

$handle = fopen ('datei.csv','r');

while (($csv_array = fgetcsv ($handle, 1000, ';')) !== FALSE ) {

  foreach ($csv_array as $index) {
    echo $index . '<br>';
  }
}

fclose($handle);

?>

Textmarkierungszeichen (enclosure) angeben

In CSV-Dateien können auch Textmarkierungszeichen (enclosure) enthalten sein. Damit werden zusammengehörige Texte markiert, sodass sie nicht getrennt werden, selbst wenn sie Trennzeichen enthalten. Sofern ein Textmarkierungszeichen zu berücksichtigen ist, gibt man diesen als vierten Parameter an. Beim folgenden Beispiel wird ein Anführungszeichen angegeben.

<?php

$handle = fopen ('datei.csv','r');

while (($csv_array = fgetcsv ($handle, 1000, ';', '"')) !== FALSE ) {

  foreach ($csv_array as $index) {
    echo $index . '<br>';
  }
}

fclose($handle);

?>

Maskierungszeichen (escape) angeben

In Zeichenketten sind häufig Zeichen enthalten, die mit einem Backslash \ maskiert sind. Das ist beispielsweise bei den sogenannten whitespaces wie \t oder \n der Fall. Auch Anführungszeichen werden häufig mit \" maskiert, falls die Zeichenkette sich innerhalb von Anführungszeichen befindet. Als fünften Parameter kann man das Maskierungszeichen angeben.

<?php

$handle = fopen ('datei.csv','r');

while (($csv_array = fgetcsv ($handle, 1000, ',', '|', '\\')) !== FALSE ) {

  foreach ($csv_array as $index) {
    echo $index . '<br>';
  }
}

fclose($handle);

?>

Eine ähnliche Funktion ist str_getcsv(). Der Unterschied dazu ist, dass bei fgetcsv() ein Dateizeiger übergeben wird und bei str_getcsv() dagegen auch die direkte Übergabe der Zeichenkette im CSV-Format möglich ist.