*.csv in SQL importieren

Tix

Erfahrenes Mitglied
Code:
U|1|3|||||Bl1 (1/18)||2||||||1|Herrn|Hegestr.|188|45966|Gladbeck|DEU|||||||||N|Einfam.Reiheneckhaus mit 4 Schlafzimmern, Garage, Terrasse und Garten. Das Haus ist voll unterkeller||EUR||||||||||||Franzstr.|34|45968|Gladbeck|DEU||||||18|128,00|51,00|5,50||189,00||1986|0|0|||||||||||||||||||||220000,00|||||||||||||||||Strassenseite1_0012VHDE.JPG|.JPG|B||Straßenansicht 1|Badezimmer1_0012LKWP.JPG|.JPG|B||Badezimmer|Kueche_00182K4P.JPG|.JPG|B||Küche|Grundriss20Keller_001MZL1E.JPG|.JPG|B||Grundriss Keller|Grundriss20EG_001WOMIV.JPG|.JPG|B||Grundriss EG|Grundriss20OG_001APEMQ.JPG|.JPG|B||Grundriss OG|||||||||||||||||||||||||||||||||||||||||||||

Das ist meine *csv-Datei, ich bekomme sie aus einem Programm exportiert und möchte diese nun mittels PHP in eine SQL-Datenbank importieren.

Wie genau mache ich das, hab mir schon www.php.net durchgelesen aber nichts wirkliches gefunden

Danke schonmal,
Tix
 
Hallo!

Du musst die Felder mit explode() aufteilen.
Dann bekommst Du $feld[0], $feld[1], $feld[2]..... usw. und kannst diese dann weiter verwenden.

Gruss Dr Dau

[edit]
Alternativ könntest Du auch fgetcsv() nehmen.
[/edit]
 
Zuletzt bearbeitet:
ich hab ein ähnliches Problem:

hier der Code(gekürzt auf das Wesentliche, mit Kommentaren versehen)
PHP:
$handle = fopen ($_POST['file'],"r");              // Datei zum Lesen öffnen, Datei wird in einem Uploadformular vorher übergeben
while ($data = fgetcsv ($handle, 1000, ",")) { // Daten werden aus der Datei in ein Array $data gelesen
  {
   mysql_query("insert into test values('$data')")or die (mysql_error());  //Array wird an die Datenbank übergeben, theoretisch zumindest  <--- hier dran haperts
  }
}

hierbei sei angemerkt, das es sich bei der Datei um eine Tabelle mit 21 Spalten und ca. 10000 Datensätzen handelt, und ist damit noch die Kleinste der Tabellen die dieses Script bearbeiten soll
 
@HawkEyeWolf, irgendwie bist Du verkehrt davor.
Erstmal muss die Datei ja hochgeladen werden, wenn Du sie danach nicht aus dem Tempordner verschiebst, würde ich es mal mit fopen($_FILES['file']['tmp_name'], "r") versuchen.
Ausserdem hast Du in der Query nicht angegeben welcher Wert in welche Spalte eingetragen werden soll.
Code:
"INSERT INTO tabelle (spalte1, spalte2, spalte3........) VALUES ('".$data[0]."', '".$data[1]."', '".$data[2]."'..........)";
Bei der Anzahl an Datensätzen kann es aber durchaus passieren dass die max_execution_time (i.d.R. 30 Sekunden) nicht ausreicht um die ganze Datei abzuarbeiten.

Gruss Dr Dau
 
Ahhso, ich hatte gehofft, das es ausreicht den Array für die Daten anzugeben. is natürlich ne heidenschreibarbeit bei 21 spalten. Glücklicherweise muss ich die Spalten der MySQL-Tabelle nicht angeben, weil ich diese schließlich nach den Spalten der csv-Tabelle designt hab.

Nur versteh ich nicht, was du genau mit dem Tempordner meinst.

Nochmal zur Erklärung der Übergabe des Filenamens:

Ich hab eine Vorseite, in dem ein Dokument steht, in welches ich den Namen der Datei eintrage(später soll dort ein Uploadscript das ganze vereinfachen). Den Wert des Dokumentfeldes 'File' wird dann an das fopen() übergeben. Was soll daran also falsch sein?
 
Mit fopen() öffnet man eine Datei, darum bin ich davon ausgegangen dass Du diese erst hochlädst.
fgetcsv() braucht eine Datei:
php.net hat gesagt.:
Der Parameter handle muss ein gültiger Dateizeiger sein, d.h. die Datei, auf die gezeigt wird, muss zuvor mit fopen(), popen() oder fsockopen() geöffnet worden sein.
Ich bin mir jetzt nicht sicher ob es überhaupt geht mehrere Zeilen aus einem <textarea> abzuarbeiten..... wenn doch, dann musst Du erstmal festlegen wo die Zeile beim auslesen aufhört.
Ich denke mal, zuerst mit explode() die Zeilen in einer Schleife trennen, dann wiederum die Felder jeder Zeile in einer Schleife Trennen.

$_POST['file'] ergibt ja:
Code:
feld1,feld2,feld3......\nfeld1,feld2,feld3....... usw.
Für dein VALUE brauchst Du aber:
Code:
'feld1','feld2','feld3'.....
Ich wüsste jetzt aber nicht wirklich wie man dass mit geringem Aufwand lösen könnte.
 
Bis jetzt geht es soweit eigentlich mit dem oberen Code ganz gut, nur stört sich MySQL nun daran, dass in einigen auszulesenden Datenfeldern ein - ' - als Auslassungszeichen steht und damit das ganze Script

PHP:
   mysql_query("insert into test values('$data[0]','$data[1]', ... ,'$data[19]','$data[20]')")or die (mysql_error());

mit einem MySQL-Fehler stoppt. Leider ist das editieren der csv kein Thema, weil die Daten unverfälscht übernommen werden sollen.
 
Wenn Du auch mal die Fehlermeldungen posten würdest.....

Dass Du die Datei nicht editieren kannst ist mir schon klar..... schon allein wegen der "etwas" vielen Einträge. ;)

Und was passiert wenn Du es so machst?
PHP:
mysql_query("insert into test values('".$data[0]."','".$data[1]."', ... ,'".$data[19]."','".$data[20]."')")or die (mysql_error());
Lass dir mal $data per echo ausgeben:
PHP:
echo "'".$data[0]."','".$data[1]."', ... ,'".$data[19]."','".$data[20]."'";
 
ändert leider nicht vielam Ergebnis

Code:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 's ReiseCenter','Suchmaschine','1','','','')' at line 1

Der Fehler tritt hierbei auf, weil als Datenwert Angie's Reisecenter(oder in der Richtung) in der csv steht, und sich das Script an diesem verdmmten ' aufhängt
 
Dann so:
PHP:
mysql_query("insert into test values('".mysql_real_escape_string($data[0])."','".mysql_real_escape_string($data[1])."', ... ,'".mysql_real_escape_string($data[19])."','".mysql_real_escape_string($data[20])."')")or die (mysql_error());
 
Zurück