0251 / 590 837 15
info@a-coding-project.de

CSV Import in PHP

CSV ist eine sehr beliebte Art, um Daten über eine Schnittstelle zu transportieren. Eine CSV-Datei ist so aufgebaut wie eine Tabelle. Die Formatierung der Tabelle ist so:

In der ersten Zeile ist meistens der Header. Jede Spalte ist getrennt von einem Semikolon.

In den weiteren Zeilen stehen dann wiederum die Daten, auch mit einem Semikolon getrennt.

Heute hab ich vor mit euch zu zeigen, wie man eine Klasse in PHP erstellt, um die Daten der Datei als Array auszulesen.

Dazu erstellen wir als erstes Mal die CSV-Datei. Ich habe dort mal drei Spalten und drei Zeilen angelegt. Die Datei wird passend zum Testen test.csv genannt:

ID;Alias;Titel
1;testseite;Titel
2;testseite;Titel 2
3;testseite;Titel 3

Nun kommen wir zum PHP Bereich. Dort haben wir 2 Dateien. Eine ist die Klasse selbst und in einer anderen geben wir die Daten zum Testen in einer HTML-Tabelle aus. Fangen wir mal mit der eigentlichen Klasse an. Die Datei davon heißt Csv2Array.php.

Sie hat die folgenden Eigenschaften:

  • $file: Gibt den Pfad der CSV-Datei an. (public)
  • $header: Gibt die Namen der Spalten wieder. (pubilc)
  • $lines: Speichert die Zeilen der CSV-Datei (private)
  • $position: Speichert die aktuelle Zeilenposition (private)

Außerdem gibt es noch die folgenden Methoden:

  • __construct: Konstruktor für die Datei. Diese liest die Zeilen aus und bestimmt den Header und setzt die Position auf 1. (public)
  • readHeader: Diese Zeil speichert den Header in die $header Variable. (private)
  • getNextRow: Die Funktion liefert die nächste Zeile der CSV Datei zurück (public)
  • readLines: Speichert die Zeilen in $lines. (private)

Fangen wir mal mit dem puren Grundgerüst an:

<?PHP
class Csv2Array{
  public $file;
  public $header;
  private $lines;
  private $position;

  function __construct($file){
  }

  private function readHeader(){
  }

  public function getNextRow(){
  }

  private function readLines(){
  }
}
?>

Weiter geht’s mit der __construct Methode. Für alle die nicht wissen, was das ist: Diese Methode wird immer aufgerufen, wenn ein neues Objekt der Klasse erstellt wird. In der Methode wird das $file und die $position gespeichert und 2 Methoden aufgerufen:

  function __construct($file){
    $this->file = $file;
    $this->readLines();
    $this->readHeader();
    $this->position = 1;
  }

Weiter geht’s mit der internen Methode readLines. Sie liest ganz simpel die Zeilen mit der file Funktion aus:

  if($handle = fopen($this->file, "r")){
      $this->lines=file($this->file);
      return true;
    }
    else{
      return false;
    }

Nun kommen wir zum Header. Hier muss die erste Zeile mit einem Semikolon gesplittet werden:

  private function readHeader(){
    $this->header = split(';',$this->lines[0]);
  }

Die schwierigste Methode von alles gibt die nächste Zeile zurück. Sie liefert das Array zurück, wenn eine Zeile vorhanden ist und false wenn nicht. So können wir das ganze später in einer While-Schleife durchlaufen. Ist die Zeile vorhanden, wird wie beim Header wieder die Zeile gesplittet.

Nun müssen wir den Header durchlaufen und in die jeweilige Spalte den Wert eintragen. Danach müssen wir noch die Zeilenposition hochsetzen und das Array zurückgeben:

  public function getNextRow(){
    if($this->lines[$this->position]){
      $line = split(';',$this->lines[$this->position]);
      $columnposition = 0;
      foreach($this->header as $column){
        $res[$column] = $line[$columnposition];
        $columnposition++; 
      }
      $this->position++;
    }
    return $res;
  }

Die Klasse an sich ist soweit fertig. Nun muss ich euch noch davon überzeugen, dass sie auch funktioniert 😉 Dazu hab ich die Datei Csv2Array.test.php erstellt. Hier wird die test.csv von oben ausgelesen und in einer Tabelle ausgegeben. Auf das HTML Grundgerüst hab ich heut mal verzichtet^^:

<?PHP
  include('Csv2Array.php');
  $csv2array = new Csv2Array("test.csv");
?>
<table>
  <thead>
    <tr>
      <?PHP
        foreach($csv2array->header as $column){
          echo "<td>".$column."</td>";
        }
      ?>
    </tr>
  </thead>
  <tbody>
    <?PHP
      while($row = $csv2array->getNextRow()){
        echo "<tr>";
          foreach($row as $column){ 
            echo "<td>".$column."</td>";
          }
        echo "</tr>";
      }
    ?>
  </tbody>
</table>

Und das gibts dann zurück:

ID Alias Titel
1 testseite Titel
2 testseite Titel 2
3 testseite Titel 3

Kommentare

red schrieb am 12.08.2009:

Und was machst du nun, wenn in einem Feld ein ; vorkommen soll?

Stefan Wienströer schrieb am 12.08.2009:

dann muss ich da noch anführungszeichen reinbauen, zweiter Teil des Tutorial kommt demnächst ;-)

Patrick schrieb am 12.08.2009:

Ich habs jetzt nur überflogen, aber genau das macht doch "fgetcsv" ??? us3.php.net/manual/en/function.fgetcsv.php

Stefan Wienströer schrieb am 13.08.2009:

Die funktion kenn ich noch gar nicht, werds mal ausprobieren