CSV in MySQL Hauptproblem: ' & " - Zeichen

Steusi

Nasenbär
Hallo Leute ich würde gerne .csv Dateien in eine MySQL Datenbank bekommen.

Dafür habe ich folgende Funktion verwendet:
PHP:
   $query_str = "LOAD DATA INFILE '".$data_dir."' INTO TABLE meineTabelle ".
                "FIELDS TERMINATED BY ';' ENCLOSE BY '\"' ".
                "LINES TERMINATED BY '\n'";
In der $data_dir ist folgendes hinterlegt:
PHP:
$upload_dir = "DerPfadAufDemServer";
$name = $_FILES['file']['name']; //Hochgeladene .csv Datei
$data_dir = $upload_dir."/".$name;
Fehlermeldung:
MySQL error 1064: 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 'ENCLOSE BY '"\' LINES TERMINATED BY ' '' at line 1

Mein Problem sind die Hochkommata bei
Code:
ENCLOSE BY '\"'
Ist es soweit richtig

Ist es möglich auf diesem Wege noch eine zusätzliche Spalte in der DB mit eigenen Informationen zu füllen?

Schon mal vielen Dank im Voraus für ein gezielten Blick und einen Ratschlag um es zum laufen zu bringen, für jeden Optimierungsvorschlag bin ich immer dankbar ;)
 
Habs zwar noch nie verwendet, sollte aber gehen. Man kann ja im LOAD DATA am schluss auch noch zusätzliche Felder mit SET abfüllen.

Code:
LOAD DATA INFILE 'file.txt'
  INTO TABLE t1
  (column1, column2)
  SET column3 = CURRENT_TIMESTAMP;

Code:
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
    [REPLACE | IGNORE]
    INTO TABLE tbl_name
    [FIELDS
        [TERMINATED BY 'string']
        [[OPTIONALLY] ENCLOSED BY 'char']
        [ESCAPED BY 'char']
    ]
    [LINES
        [STARTING BY 'string']
        [TERMINATED BY 'string']
    ]
    [IGNORE number LINES]
    [(col_name_or_user_var,...)]
    [SET col_name = expr,...)]
 
Danke, SET werde ich ausprobieren, sobald es läuft. An CURRENT_TIMESTAMP hab ich auch schon gedacht und habe es gerade auf automatisch einfügen gestellt (in der Datenbank)
Aber liebe wäre es mir, wenn ich ein anderes Datum setzten könnte ;)
Da der Name schon in der CSV-Datei enthalten ist!

Gut ich habe mir die Struktur der Funktion, welche du mir hier zeigt genau angesehen, aber ich finde keinen Fehler zu meiner.

Außer das ich mir nicht sicher bin, wie ich die Anführungsstriche oben (") zwischen die Hochkommata bringe, damit sie akzeptiert werden.

Da bei dir ja auch folgendes steht:
Code:
[[OPTIONALLY] ENCLOSED BY 'char']
Also nur ein Zeichen, das 1. Zeichen wäre hier bei mir aber der Backslash (\)
womit ich die Anführungsstriche oben (") darstellen möchte...
Verzwickt, oder ich sehe den Wald vor lauter Bäumen nicht, hast du oder jemand anderes einen Geistesblitz für mich?
 
Versuchs doch mal mit
Code:
ENCLOSE BY '{$chr(34)'

Somit können wir ev das Parsing-Problem des " im PHP beseitigt

Also im PHP:
PHP:
$query_str = "LOAD DATA INFILE '{$data_dir}' INTO TABLE meineTabelle 
			FIELDS TERMINATED BY ';' ENCLOSE BY '{chr(34)}' 
			LINES TERMINATED BY '\n'";
// oder
$query_str = sprintf("LOAD DATA INFILE '{$data_dir}' INTO TABLE meineTabelle 
			FIELDS TERMINATED BY ';' ENCLOSE BY '%c' 
			LINES TERMINATED BY '\n'", 34);
 
Danke für den Tipp, bei dem char(34) hatte er keine Umwandlung in das Zeichen selbst vorgenommen. Wenn mich das hier schon sehr an C erinnert, wie wir versuchen es zu umschreiben ;) (Aber in PHP klappt ja fast alles)
Das 2. schrieb wenigstens alles, so wie es richtig aussieht, aber meine Fehlermeldung ist nicht weg, ich habe auch keine Ahnung was ich falsch mache.

Fehler:
MySQL error 1064: 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 'ENCLOSE BY '"' LINES TERMINATED BY ' '' at line 2

var_dump gibt mir alles korrekt aus:
string(176) "LOAD DATA INFILE 'uploaded_files/Datei.csv' INTO TABLE TabelleInDatenbank FIELDS TERMINATED BY ';' ENCLOSE BY '"' LINES TERMINATED BY ' '"

Habe bei dem Datei-Pfad auch schon einmal den konkreten Pfad angeben, leider ohne Erfolg.
Vielleicht ist es gar kein Parsing-Problem? Sondern ein Syntaxfehler?
 
Zuletzt bearbeitet:
Hi Steusi,

kann es sein das hier der Grund für die Fehlermeldung liegt:.

Du schreibst: ENCLOSE BY aber es müsste doch ENCLOSED BY heißen oder?

Gruß Thomas
 
Zuletzt bearbeitet:
Danke, natürlich war das der Fehler (ich schweige mal und verweise auf meine Signatur) :-(:-(:-(:-(:-(

Leider funktioniert es immer noch nicht, ich erhalte folgende Meldung:

MySQL error 1062: Duplicate entry '1' for key 1

Das Problem, er trennt die Felder nicht richtig von einander.

meine CSV:

Code:
Gewicht	Anzahl
0	2554
1	1298

in der DB

Code:
ID	Gewicht	Anzahl	Datum
1	0	0	29.10.2009
2	2554	0	29.10.2009

//edit:

So funktioniert es, lag an der Struktur der DB, kann ich beim einlesen noch sagen, dass die erste Zeile nicht genommen werden soll, sieht unschön in der DB aus!
[IGNOR] geht dafür nicht, dachte ich erst :D
Code:
Gewicht 	Anzahl 	ID  	Datum 
0	0	7	29.10.2009 
0	2554	8	30.10.2009 
1	1298	9	29.10.2009
 
Zuletzt bearbeitet:
So ich nochmal,

habe jetzt bei mir ein bisschen getestet und so müsste es bei dir funktionieren:

PHP:
LOAD DATA INFILE 'dateiname' INTO TABLE tabellenname
FIELDS TERMINATED BY ';' ENCLOSED BY '\"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(gewicht, anzahl) SET datum = CURDATE(), id = RAND()

Durch die Angabe von (gewicht, anzahl) wird festgelegt welche Felder in der Tabelle mit den Daten aus der CSV-Datei beschrieben werden sollen und SET datum = CURDATE(), id = RAND() schreibt in das Feld DATUM dann das aktuelle Datum und für die ID wird hier halt einfach eine Zufallszahl erzeugt. IGNORE 1 LINES bewirkt bei mir das die erste Zeile nicht eingelesen wird.

Gruß Thomas
 
Zuletzt bearbeitet:
Zurück