Erstellen einer CSV-Datei mit PHP

Eigentlich ist nichts schwieriges dabei, in PHP eine CSV-Datei zu erstellen. Wie der Name schon sagt, ist das lediglich eine Textdatei mit „Comma-Separated Values“ (siehe Wikipedia) und damit ist das Format der Datei auch schon beschrieben: verschiedene Felder sind mit Kommata (oder auch Semikolon) voneinander abgetrennt, bestmöglich ist Text noch in Anführungszeichen gesetzt.

  1. Was allerdings, wenn die Datei gleich über den Browser an die beim Benutzer vorhandene Anwendung für Tabellenkalkulation (z. B. Microsoft Excel oder OpenOffice Calc) gesendet und damit geöffnet werden soll?
  2. Oder zum Beispiel, wenn in den Felder Zeilenumbrüche vorhanden sind, die auch so erhalten bleiben sollen?

Dann ist die Lösung schon etwas komplizierter und ich beim nächsten Mal nicht wieder suchen muss (und ihr von Anfang an nicht), hab ich hier die Lösung mal kurz zusammengestellt.

Die Lösung für Fall 1 ist eigentlich recht simpel – man setzt einfach die HTTP-Header entsprechend:

header(‚Content-type: text/x-csv‘);
header(‚Content-Disposition: attachment; filename=“filename.csv“‚);

In der ersten Zeile wird dem Browser mitgeteilt, dass der Inhalt der aufgerufenen URL keine HTML-Seite, sondern vom Typ „text/x-csv“ ist. Das ist der sog. MIME-Typ (siehe auch Wikipedia). Die zweite Anweisung sagt aus, dass der folgende Inhalt unter dem Dateinamen filename.csv als attachement zu behandeln ist – also als Download anzuzeigen ist. Somit erscheint dann i.d.R. auch das gewohnte Fenster für einen Download.

Fall 2 stellt sich etwas kniffliger dar, aber mit ein bisschen Spicken bei der Standard-Anwendung phpMyAdmin hilft auch hier weiter.

$data = array();
$data[] = …;

while(list($k, $v) = each($data))
     $data[$k]= ereg_replace(„\015(\012)?“, „\012“, str_replace(„\““,“\“\““, $v));

$line = „\““.implode(„\“;\““, $data).“\“\n“;
echo $line;

In das neu erstellte Array $data werden alle Feldwerte eingelesen. Diese können direkt aus der Datenbank gelesen werden, vom Benutzer eingegeben worden sein, oder auch irgendwie anders entstanden sein. In diesem Array werden anschließend die Anführungszeichen (durch zwei Anführungszeichen) und Zeilenumbrüche (durch einen einfachen Zeilenumbruch) ersetzt. Der Zeilenumbruch muss ersetzt werden, da hier Linux und Windows unterschiedlich agieren. Danach wird per implode eine Zeile zusammengesetzt und im vorliegenden Beispiel direkt ausgegeben (bzw. direkt an den Browser gesendet).

Fertig ist die universale Funktion zur Ausgabe einer Liste als CSV-Datei.

Über Markus Zierhut

Life Is What You Make It!
Dieser Beitrag wurde unter PHP, Softwareentwicklung abgelegt und mit , , , , , verschlagwortet. Setze ein Lesezeichen für den Permalink.

4 Kommentare zu Erstellen einer CSV-Datei mit PHP

  1. Lukas sagt:

    und noch schönen lässt sich der Datenimport mit Offce/Excel iXML darstellen.
    Pros:
    – mehrere Worksheet
    – farben und formatierung
    – usw

    Con:
    – ist natürlich etwas umfangreicher einzuarbeiten, aber wenn die inputdaten schon strukturiert sind ist es des auf jeden Fall wert.

    Grüße

  2. Klingt nicht schlecht, werde ich mir bei Gelegenheit mal anschauen (oder willst du da ein bisschen was drüber schreiben?). Danke für den Tipp!

  3. Jens sagt:

    Gut so eine Funktion immer irgendwo gespeichert zu haben, wird ja doch recht häufig gebraucht.

    Kann es sein das du einige Zeichenfehler hast oder liegt das an meinem Rechner?

  4. Da hat sich wohl wirklich ein Fehler im Zeichensatz eingeschlichen – ist korrigiert. Danke für den Hinweis!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden.