Funktion str_getcsv() - string im CSV-Format parsen

Zeichenketten werden häufig in CSV-Dateien bereitgestellt, die man z.B. aus einer Tabellenkalkulation heraus erstellen kann. Dabei sind die einzelnen Werte durch ein Komma (oder einem anderen Trennzeichen) getrennt. CSV-Dateien eignen sich sehr gut für die Verarbeitung großer Datenmengen und können dazu beitragen, den Aufwand für die Datenpflege zu reduzieren. Ein typisches Beispiel hierfür ist ein Online-Shop, bei dem die Produktdaten nicht einzeln gepflegt werden sollen, sondern über eine CSV-Datei. So kann man mit einem Dateiupload die Daten von tausenden Produkten aktualisieren.

Um eine Zeichenkette im CSV-Format zu parsen, sodass die einzelnen Werte in einem indizierten Array gespeichert werden, kann man die Funktion str_getcsv() verwenden. Innerhalb der runden Klammern können die folgenden Parameter angegeben werden.

  1. Die Zeichenkette, die geparst werden soll (string).
  2. Das Trennzeichen (string, optional, nur ein Zeichen, standardmäßig ein Komma).
  3. Textmarkierungszeichen (string, optional, nur ein Zeichen, standardmäßig ein Anführungszeichen).
  4. Maskierungszeichen (string, optional, nur ein Zeichen, standardmäßig ein Backslash).

Beim folgenden Beispiel wird die Variable $str geparst und die Werte können über $csv_array ausgelesen werden.

<?php

// String im CSV-Format
$str = 'Max,Mustermann,123456789,Musterhausen';

// $str parsen und Werte in $csv_array speichern
$csv_array = str_getcsv ($str);

// Array zur Kontrolle zeilenweise ausgeben
foreach ($csv_array as $wert) {
  echo $wert . '<br>';
}
?>

Trennzeichen (delimiter) angeben

Nicht immer wird ein Komma als Trennzeichen (delimiter) verwendet. Geläufig ist auch ein Semikolon. In dem Fall muss man das Trennzeichen mit dem zweiten Parameter innerhalb von Anführungszeichen angeben.

<?php

$str = 'Max;Mustermann;123456789;Musterhausen';

// $str parsen mit Semikolon als Trennzeichen
$csv_array = str_getcsv ($str, ';');

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

Textmarkierungszeichen (enclosure) angeben

Als dritten Parameter kann man das Textmarkierungszeichen (enclosure) angeben. Damit wird quasi ein zusammengehöriger Text markiert. Das kann notwendig sein, wenn z.B. im Text Kommas enthalten sind, diese jedoch nicht als Trennzeichen behandelt werden sollen. Beim folgenden Beispiel wird der Text "Mustermann, Max" nicht getrennt.

<?php

$str = '"Mustermann, Max",123456789,Musterhausen';

$csv_array = str_getcsv ($str, ',', '"');

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

Maskierungszeichen (escape) angeben

Zeichenketten enthalten häufig Zeichen, die mit einem Backslash \ maskiert sind, z.B. sogenannte whitespaces wie \t oder \n. Auch Anführungszeichen werden mit \" maskiert, wenn sich die Zeichenkette innerhalb von Anführungszeichen befindet. Als vierten Parameter kann man das Maskierungszeichen angeben. Beim folgenden Beispiel werden die Anführungszeichen bei "Mustermann, Max" beibehalten. Außerdem ist nach 1234 ein Tabstopp sowie zwei Leerzeilen vor Musterhausen. Der Effekt lässt sich im Quelltext der PHP-Seite nachvollziehen. Der Parameter \\ entspricht dabei dem Standard.

<?php

$str = "|\"Mustermann, Max\"|,|1234\t56789|,|<br>\n\nMusterhausen|";

$csv_array = str_getcsv ($str, ',', '|', '\\');

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

Zeichenkette aus CSV-Datei auslesen

Die Funktion str_getcsv() benötigt als ersten Parameter den string im CSV-Format. Die direkte Angabe einer Datei ist nicht möglich. Man kann jedoch mit der Funktion file() eine CSV-Datei einlesen, einem Array zuweisen, das Array auslesen und die Funktion str_getcsv() anwenden. Beim folgenden Beispiel wird datei.csv eingelesen. Danach werden die strings aus dem Array ausgelesen, mit str_getcsv() geparst und danach wird das Array $csv_array mit den Einzelwerten ausgegeben.

<?php

// CSV-Datei einlesen, $csvfile zuweisen
$csvfile = file('datei.csv');

// $csvfile auslesen
foreach ($csvfile as $index) {

  // Zeichenkette parsen
  $csv_array = str_getcsv ($index, ';');

  // Array mit den Einzelwerten auslesen und ausgeben
  foreach ($csv_array as $wert) {
    echo $wert . '<br>';
  }
}
?>

Eine ähnliche Funktion ist fgetcsv(). Damit können Dateien im CSV-Format ausgelesen werden. Eine direkte Übergabe einer Zeichenkette im CSV-Format wie bei str_getcsv() ist dagegen nicht möglich.