W3docs

str_getcsv()

PHP str_getcsv() Funktion: Syntax, Parameter, Beispiele, mehrzeiliges CSV, Anführungszeichen-Felder und häufige Fallstricke erklärt.

Die Funktion str_getcsv() parst eine einzelne Zeile CSV-Text (kommagetrennte Werte) und gibt deren Felder als flaches Array zurück. Sie ist das In-Memory-Gegenstück zu fgetcsv(): Anstatt eine Zeile aus einem geöffneten Datei-Handle zu lesen, arbeitet sie auf einem String, den Sie bereits haben — eine Zeile aus einem Formular, eine einzelne Zeile aus einer API-Antwort oder ein Element eines Arrays, das Sie selbst aufgeteilt haben.

Da echtes CSV schwieriger ist als es aussieht (Felder können in Anführungszeichen eingeschlossen sein, Kommas enthalten oder sich über den Trennzeichenbereich erstrecken), ist str_getcsv() fast immer die bessere Wahl gegenüber einem naiven explode(',', $line), das bei jedem Komma innerhalb von Anführungszeichen versagt.

Syntax

str_getcsv(
    string $string,
    string $separator = ",",
    string $enclosure = "\"",
    string $escape = "\\"
): array
ParameterErforderlichBeschreibung
$stringJaDie zu parsende CSV-Zeile.
$separatorNeinDas Feldtrennzeichen — ein einzelnes Zeichen. Standard ,.
$enclosureNeinDas Zeichen, das Felder umschließt, die das Trennzeichen, Anführungszeichen oder Zeilenumbrüche enthalten. Standard ".
$escapeNeinDas Escape-Zeichen. Standard \. Übergeben Sie "", um PHPs proprietäres Escaping zu deaktivieren (empfohlen für striktes RFC 4180 CSV).

Die Funktion gibt immer ein Array zurück. Ein leeres Feld wird zu einem leeren String (""); eine vollständig leere Eingabezeile gibt [null] zurück.

Einfaches Beispiel

php— editable, runs on the server

Ausgabe:

Array
(
    [0] => John
    [1] => Doe
    [2] => 25
)

Jeder kommagetrennte Wert wird zu einem Element, indiziert ab 0.

Felder in Anführungszeichen und eingebettete Kommas

Hier zeigt str_getcsv() seinen Mehrwert. Ein in doppelte Anführungszeichen eingeschlossenes Feld kann das Trennzeichen enthalten, ohne aufgeteilt zu werden:

<?php
$input = '"Doe, John","New York, NY",25';
$array = str_getcsv($input);

print_r($array);
?>

Ausgabe:

Array
(
    [0] => Doe, John
    [1] => New York, NY
    [2] => 25
)

Die umschließenden Anführungszeichen werden entfernt, und die Kommas darin bleiben als Daten erhalten. explode(',', $input) hätte hier fälschlicherweise fünf Elemente erzeugt.

Andere Trennzeichen und Umschließungszeichen verwenden

Viele „CSV"-Dateien sind tatsächlich semikolon- oder tabulatorgetrennt. Überschreiben Sie das zweite und dritte Argument entsprechend:

<?php
$input = "'Jane Doe';'Berlin';30";
$array = str_getcsv($input, ';', "'");

print_r($array);
?>

Ausgabe:

Array
(
    [0] => Jane Doe
    [1] => Berlin
    [2] => 30
)

Für eine tabulatorgetrennte Zeile verwenden Sie "\t" als Trennzeichen.

Einen mehrzeiligen CSV-String parsen

str_getcsv() parst eine Zeile auf einmal. Um ein ganzes CSV-Dokument in Zeilen umzuwandeln, teilen Sie es zunächst in Zeilen auf und verarbeiten Sie dann jede Zeile mit der Funktion. Die Kombination mit array_map() macht dies kompakt:

<?php
$csv = "name,city,age\nJohn,Boston,25\nJane,Berlin,30";

$rows = array_map('str_getcsv', explode("\n", $csv));

print_r($rows);
?>

Ausgabe:

Array
(
    [0] => Array
        (
            [0] => name
            [1] => city
            [2] => age
        )

    [1] => Array
        (
            [0] => John
            [1] => Boston
            [2] => 25
        )

    [2] => Array
        (
            [0] => Jane
            [1] => Berlin
            [2] => 30
        )

)

Hinweis: explode("\n", ...) ist eine einfache Aufteilung. Wenn Ihre Datei Windows-Zeilenenden (\r\n) verwendet oder Felder innerhalb von Anführungszeichen Zeilenumbrüche enthalten, lesen Sie die Datei besser mit fgetcsv() in einer Schleife, da diese Fälle dort nativ behandelt werden.

Zeilen einem Header zuordnen

Ein gängiges Muster besteht darin, die erste Zeile als Schlüssel zu verwenden und assoziative Arrays mit array_combine() aufzubauen:

<?php
$lines  = ['name,city,age', 'John,Boston,25', 'Jane,Berlin,30'];
$header = str_getcsv(array_shift($lines));

$people = [];
foreach ($lines as $line) {
    $people[] = array_combine($header, str_getcsv($line));
}

print_r($people[0]);
?>

Ausgabe:

Array
(
    [name] => John
    [city] => Boston
    [age] => 25
)

Häufige Fallstricke

  • Nur eine Zeile. Das Übergeben eines mehrzeiligen Strings behandelt alles als einen einzigen Datensatz, daher müssen Sie den String immer selbst in Zeilen aufteilen, bevor Sie ihn parsen.
  • Das Escape-Zeichen überrascht viele. PHPs Standard-Escaping mit \ ist nicht standardkonform. Für Daten, die RFC 4180 folgen (bei dem " durch Verdopplung als "" escaped wird), übergeben Sie escape: "", damit keine Backslashes verschluckt werden.
  • Zahlen bleiben Strings. Jedes Feld kommt als String zurück ("25", nicht 25). Wandeln Sie explizit um, wenn Sie echte Zahlen benötigen.
  • Abschließender Zeilenumbruch. Eine Zeile mit einem abschließenden \n kann ein leeres letztes Feld erzeugen; kürzen Sie die Eingabe vorher mit trim(), falls nötig.

Verwandte Funktionen

  • fgetcsv() — liest und parst eine CSV-Zeile direkt aus einem Datei-Handle.
  • fputcsv() — schreibt ein Array als CSV-Zeile in eine Datei (die Umkehrfunktion).
  • explode() — teilt einen String nach einem Trennzeichen, wenn keine Felder mit Anführungszeichen vorhanden sind.
  • file_get_contents() — lädt eine CSV-Datei als String, um sie str_getcsv() zu übergeben.

Übung

Übung
Was macht die Funktion str_getcsv() in PHP?
Was macht die Funktion str_getcsv() in PHP?
Was this page helpful?