CSV Datei Import in eine MYSQL Datenbank über PHP

micha

Erfahrenes Mitglied
Hallo PHPler :)

Wollte mal fragen, wie man dieses Problem löst:
Vorhanden ist eine CSV Datei, deren Inhalt in eine Datenbank über ein PHP Script importiert werden soll. (Durch Semicolon getrennt)
Im ersten Schritt soll durch den druck auf "Durchsuchen" die Datei auf der Festplatte gewählt werden. Dann durch einen Druck auf einen Submitbutton das Einlesen ausgeführt werden. zunächst in Variablen, die erst nach einer Ausgabe zum Gegenkorrekturlesen und einem danach folgenden Betätigen eines Submitbuttons in die Datenbank geschrieben werden.

Wie realisiere ich das, wenn ich nun wirklich nicht viel Ahnung von PHP habe.

Pro
-> Apache läuft
-> Mysql läuft
-> phpscript hat Verbindung zur Datenbank
-> HTML Layout ist fertig

Contra
-> keine Formulare angegeben
-> keine Ahnung, wie das funktionieren soll

Danke schonmal für die Hilfe.
 

Tim C.

Erfahrenes Mitglied
Original geschrieben von micha
Wie realisiere ich das, wenn ich nun wirklich nicht viel Ahnung von PHP habe.
Dann wahrscheinlich überhaupt nicht.

Alle deine Pro Punkte, sind keine Pro Punkte sondern bis auf das HTML Layout überhaupt erstmal die Grundlagen. Ohne könntest du ja überhaupt keine solche Applikation entwickelt. Also, das sind keine positiven Eigenschaften, sondern die absolut notwendige Basis. ;)

Entweder es gibt irgendwo in den Weiten des Web oder in den Weiten von PEAR eine Klasse, die das parsen von CSV Dateien ermöglichst, oder du solltest dir mal http://www.php.net/explode zum trennen der Werte pro Zeile, http://www.php.net/file zum Einlesen der gesamten Datei, sowie Sessions für das Zwischenspeichern bei der Vorschau und File Uploads für das Hochladen der Datei angucken.

Ganz wichtig zu verstehen ist, dass du mit einem Upload Formular, die Datei niemals direkt an ein PHP-Script übergibst. Diese wird zunächst IMMER per HTTP auf den Server geladen und von dort aus dem temporären Verzeichnis an das Script übergeben.
 

ludz

Erfahrenes Mitglied
schau dir diese Funktion mal an: http://de.php.net/fgetcsv

Nach dem Auslesen der Datei und Speichern der Werte in Variablen / einem Array, diese zum Korrektur lesen ausgeben, und bei anschließender Bestätigung Daten weitergeben sowie ein entsprechendes SQL-Query (INSERT...) zusammenbauen und an die Datenbank senden.
So viel zum Prinzip.
 

micha

Erfahrenes Mitglied
danke schonmal.

die daten liest er nun aus und trägt sie auch fein untereinander ein. es geht nun also erstmal nurnoch um das formatieren dieser daten.

ich werde mich nochmal melden, wenn ich weiter gekommen bin
 

micha

Erfahrenes Mitglied
PHP:
<?php 
$row = 1;                                      // Anzahl der Arrays
$handle = fopen ("testds.csv","r");   	       // Datei zum Lesen öffnen
echo"<table bordeR=1><tr>";                    // eröffnen einer table und einer spalte VOR beginn der ersten schleife
while ($data = fgetcsv ($handle, 1000, ";")) { // Daten werden aus der Datei
                                               // in ein Array $data gelesen
   $num = count ($data);                       // Felder im Array $data
                                               // werden gezählt
   $row++;                                     // Anzahl der Arrays wird 
                			       // inkrementiert
   for ($c=0; $c < $num; $c++) {               // FOR-Schleife, um Felder 
       echo "<td>$data[$c]</td>";              // des Arrays auszugeben in einer zeile
   }
   echo"</tr>";					//ende spalte -> beginn nächster schleifendurchlauf in neuer spalte
}
echo"</table>	";				//ende table
fclose ($handle);
?>

sodele.

das ergebnis ist eine weiße datei, wo meine 2 zeilen ausgegeben werden, die die csv derzeit enthält.
habe es nun hingemurkselt, dass sie horizontal ausgegeben werden, aber vertikal wäre mir lieber. d.h. die erste zeile in eine spalte und die 2te zeile in die zweite spalte.

habe es ein wenig versucht, aber nicht hinbekommen. kann mir da einer helfen ? das mit den schleifen ist für mich so unübersichtlich.
 

stanleyB

Erfahrenes Mitglied
Du schaffst dir vorher deine Tabellenstruktur mit CREATE selbst und arbeitest anschliessend (nach dem Upload) so:
Code:
mysql> LOAD DATA INFILE 'deine_datei.csv' INTO TABLE deine_tabelle
    -> FIELDS TERMINATED BY ';' ENCLOSE BY '"'
    -> LINES TERMINATED BY '\n';

Gruesse,
stanleyB
 
Zuletzt bearbeitet:

micha

Erfahrenes Mitglied
hm, ich wollte es erstmal auf diesem weg machen, den ich angefangen habe,
es hapert derzeit jedoch am 2spalitigen auslesen vertikal.
horizontal ging es ja....
 

micha

Erfahrenes Mitglied
Kann mir nochmal jemand helfen ?
Es wäre wichtig, dass ich heute das Vertikale auslesen hinbekomme, da ansonsten mein Projekt auf Eis liegt und mir mein Chef aufs Dach springt.
 

Tim C.

Erfahrenes Mitglied
Original geschrieben von micha
Kann mir nochmal jemand helfen ?
Es wäre wichtig, dass ich heute das Vertikale auslesen hinbekomme, da ansonsten mein Projekt auf Eis liegt und mir mein Chef aufs Dach springt.
Speicher die zwei horizontalen Reihen in zwei getrennte Arrays und gebe diese abwechselnd in eine Tabelle aus.
Es wird davon ausgegangen, dass beide vertikale Reihen gleich viel Elemente haben.
PHP:
$array1; // Müsstest du mit den Daten aus Zeile 1 füllen
$array2; // Müsstest du mit den Daten aus Zeile 2 füllen

echo "<table>";
for($i=0;$i<count(array1);$i++) {
  echo "<tr><td>".$array1[$i]."</td><td>".$array2[$i]."</td></tr>";
}
echo "</table>";

Alternativ kann ich dir noch folgenden Code anbieten, der für eine zweizeilige CSV Datei, auch bei ungleicher Anzahl an Elementen und ohne den ganzen CSV Funktionskram funktionieren sollte (wohlgemerkt ungetestet).
PHP:
$csvFile = "datei.csv";
$fileArray = file($csvFile);

$array1 = explode(";",$fileArray[0]);
$array2 = explode(";",$fileArray[1]);

if(count($array1) >= count($array2)) { $maxrows = count($array1); }
else { $maxrows = count($array2); }

echo "<table>\n";

for($i=0;$i<$maxrows;$i++) {
  if($array1[$i] == "" || !isset($array1[$i])) {
    $array1[$i] = "&nbsp;";
  }
  if($array2[$i] == "" || !isset($array2[$i])) {
    $array2[$i] = "&nbsp;";
  }

  echo "\t<tr><td>".$array1[$i]."</td><td>".$array2[$i]."</td></tr>\n";
}
echo "</table>";
 

micha

Erfahrenes Mitglied
danke schonmal. das hat mich weiter gebracht.
die ausgabe der CSV datei ist nun schön vertikal.

jetzt schreibe ich mal dahingehend weiter, dass er nach dem klick auf einen submit button eine zeile weiter nach unten / nach oben springt und somit der nächste datensatz ausgegeben wird.

ich habe dein 2tes script verwendet. das funktioniert einwandfrei. nur welche variable muss ich erhöhen, dass er mir zeile 3 der csv datei ausgibt ? zeile 1 ist ja nur die jeweilge überschrift, array 1 bleibt also immer unverändert.
 
Zuletzt bearbeitet: