CSV Import in MySQL

Da der Thread noch nicht geschlossen ist und ich gerade ebenfalls nach einer Update-Funktion suche möchte ich das Thema gerne nochmal aufgreifen.

Mit LOAD DATA LOCAL INFILE habe ich soeben auch mein Glück (leider mit dem gleichen Ergebnis wie der Ersteller dieses Threads) versucht.
Ich dachte zunächst ebenfalls, dass ich mit @dummy das Feld nicht anrühre... denkste :p
So bin ich zufällig auf das Thema hier gestossen.


Jetzt bin ich am überlegen, wie ich das ganze mit PHP angehe.
Folgender - mal ganz einfach angedachter - Lösungsansatz:

Die Daten aus der csv mit explode und \n als delimiter in ein Array ablegen.
Beispiel:
PHP:
$csvfile = "1','Birne','grün\n2','Erdbeere','rot";

$zeile = explode("\n",$csvfile);

// Ergebnis:
// Array
// (
//    [0] => 1','Birne','grün
//    [1] => 2','Erdbeere','rot
// )

Dann dieses Array durcharbeiten und die Einträge wieder mit explode und diesmal ',' als delimiter nacheinander mittels UPDATE in die Datenbank schreiben.

Beispiel:
PHP:
foreach($zeile as $felder)
{
  $feld = explode("','",$felder);

  $sql="UPDATE obst SET Sorte='$feld[1]', Farbe='$feld[2]' WHERE ID='$feld[0]'";
  // SQL QUERY ..

}

Wenn man jetzt z.B. einen Eintrag unverändert lassen will schließt man diesen einfach aus dem UPDATE aus:

PHP:
foreach($zeile as $felder)
{
  $feld = explode("','",$felder);

  $sql="UPDATE obst SET Farbe='$feld[2]' WHERE ID='$feld[0]'";
  // SQL QUERY ..

}


Müsste auf jeden Fall so klappen
 
Zuletzt bearbeitet:
Warum selber mit explode() arbeiten und damit ev. Fehler einbauen weil ein Feld in " gesetzt ist?
PHP bietet da bereits die Funktion fgetcsv() an um eine csv-Datei zu parsen.
Oder str_getcsv() um einen CSV-String zu parsen
 
Ja, guter Tipp! :D

Edit:
Ich bin jetzt echt am grübeln, ob ich das UPDATE via php mache.
Habe bislang immer mit der zusätzlichen Tabelle gearbeitet und von dort das UPDATE gestartet.
Aber das Datenbank Hin-und-Her-Geschiebe ist doch irgendwie immer nervig.
Daher wollte ich ja auch erst den Versuch mit LOAD DATA machen.

Wenn ich das PHP-Skript einmal ordentlich programmiert habe ist Ruh'.
Dann müsste ich nur noch das PHP-Skript aufrufen und fertig.

Via php die CSV starten oder mit der Stage-Tabelle?
Die Tabelle hätte den Vorteil, dass man erst gucken kann, ob alles gut in die Datenbank eingetragen wurde und danach das SQL-UPDATE macht.
Obwohl, das Skript könnte man ja auch erst in eine Stage-Tabelle laden und von dort dann das UPDATE starten.

Wie würdest du es machen Yaslaw?
 
Zuletzt bearbeitet:
Da ich ein DB-Mensch bin, würde ich die DB nehmen.

Unter Umständen eine Stage-Tabelle die genau der Target-Tabelle entspricht. Dazu noch ein INSERT-Trigger, damit der Update gleich automatisch abläuft.

SQL:
CREATE TRIGGER TRG_STAGE
BEFORE INSERT ON stage_table FOR EACH ROW 
BEGIN  
	INSERT INTO 
		target_table (id, field1, field2)  
	VALUES (NEW.id, NEW.field1, NEW.field2)  
		ON DUPLICATE KEY UPDATE field2 = NEW.field2; 
END;

Es kommt wirklich drauf an, wie viele verschiedene Uploads es gibt, wie häufig man die Definitionen ändern muss etc.
 
Zuletzt bearbeitet von einem Moderator:
Zurück