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>";