30.092015

CSV von einer Webseite in PHP einlesen

Heute möchte ich zwei Lösungsansätze für das Einlesen eines CSV von einer Webseite in PHP vorstellen. Der erste Lösungsansatz verwendet CURL und str_getcsv zum Einlesen der externen Daten. Der zweite Lösungsansatz baut auf fgetcsv auf.

Der erste Lösungsansatz mittels CURL und str_getcsv könnte wie folgt aussehen:

// Festlegung der CSV Quelle
$url = 'http://example.org/content.csv';

// Einlesen der CSV-Daten mittels CURL
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/plain'));
$csvData = curl_exec($ch);
curl_close($ch);

// Verarbeitung der CSV-Daten
$data = array();
if (!empty($csvData)) {
  $fieldNames = array();
  $tmpData = str_getcsv($csvData, "\n");
  foreach($tmpData as $idx => $row) {
    // Die erste Zeile enthaelt die Feldnamen der Werte
    if ($idx == 0) {
      $fieldNames = str_getcsv($row, ';');
    } else {
      $row = str_getcsv($row, ';');
      // Sofern Daten fuer die Zeile vorhanden, diese uebernehmen
      if (!empty($row)) {
        $tmp = array();
        foreach ($fieldNames as $fIdx => $fName) {
          $tmp[$fName] = $row[$fIdx];
        }
        if (!empty($tmp)) {
          $data[] = $tmp;
        }
      }
    }
  }
}

// Ausgabe der importieren Daten
echo "<pre>" . print_r($data, true) . "</pre>";

Der zweite Lösungsansatz mittels fgetcsv setzt dabei voraus, dass 'allow_url_fopen' in der php.ini aktiviert ist:

// Festlegung der CSV Quelle
$url = 'http://example.org/content.csv';

$data = array();
if (($handle = fopen($url, "r")) !== FALSE) {
  $row = 1;
  $fieldNames = array();
  // Zeilenweises Einlesen und Verarbeiten der CSV-Daten
  while (($tmpData = fgetcsv($handle, 0, ";")) !== FALSE) {
    // Sofern Daten fuer die Zeile vorhanden, diese uebernehmen
    if (!empty($tmpData)) {
      // Die erste Zeile enthaelt die Feldnamen
      if ($row == 1) {
        $fieldNames = $tmpData;
      } else {
        $tmp = array();
        foreach ($fieldNames as $fIdx => $fName) {
          $tmp[$fName] = $tmpData[$fIdx];
        }
        if (!empty($tmp)) {
          $data[] = $tmp;
        }
      }
      $row++;
    }
  }
  fclose($handle);
}
// Ausgabe der importieren Daten
echo "<pre>" . print_r($data, true) . "</pre>";