Zur Navigation

CSV into MySQL

1 Marco

Guten Abend

Ich bin gerade daran ein script zu basteln, das mir den Inhalt meiner CSV Datei in meine SQL Datenbank einliest.

Leider funktioniert mein code nicht. Der Fehler liegt an folgender Stelle:

$eintrag = "LOAD DATA LOCAL INFILE '160.csv' REPLACE INTO TABLE data FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '""' LINES TERMINATED BY 'rn' (itemID,typeID)";

$eintragen = mysql_query($eintrag);

Folgende Fehlermeldung erscheint:

Parse error: parse error, unexpected T_CONSTANT_ENCAPSED_STRING in /home/www/web65/html/billig-kaufen/import/ebay/go.php on line 28

Kann mir jemand weiterhelfen?

Gruss Marco

12.04.2007 21:33

2 Jörg

Hallo Marco,

der Query-String ist ja durch doppelten Anführungszeichen begrenzt, darin enthaltene doppelte Anführungszeichen müssen deswegen maskiert werden, probier es mal so:

$eintrag = "LOAD DATA LOCAL INFILE '160.csv' REPLACE INTO TABLE data FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\"\"' LINES TERMINATED BY 'rn' (itemID,typeID)";

12.04.2007 21:40

3 Jörg

Nachtrag:

in der Query selbst fehlen aber auch noch ein paar Backslashes bei der Bezeichnung des Zeilenumbruchs:

LINES TERMINATED BY '\r\n'

12.04.2007 21:48 | geändert: 12.04.2007 21:49

4 Marco

Hallo Jörg

Danke für Deine Hilfe. Das ganze schaut jetzt schon besser aus. Der Import funktioniert allerdings noch nicht.

Eventuell liegt das Problem irgendwo anderst. Kann es sein, dass das CSV file nur 58Kb gross ist und das .tar.gz file ausdem ich das CSV file ausgepackt habe hingegen über 5MB gross ist? Ich entpacke das .tar.gz File auf dem Server wie folgt:

$file = "160.tar.gz";
$entpack = shell_exec('tar xfvz '.$file);

Gruss Marco

12.04.2007 21:56

5 Jörg

Gibt die Datenbank einen Fehler aus?

$eintragen = mysql_query($eintrag);

echo mysql_error();

12.04.2007 22:23

6 Marco

Folgender Fehler git PHP mir aus:

Field separator argument is not what is expected; check the manual

12.04.2007 23:03

7 Jörg

Sind die Felder in dre CSV-Datei mit Komma getrennt?

Noch was: ist das Escapezeichen korrekt angegeben? Ich würde hier eher ein "\" vermuten (innerhalb des Query Strings "\\"). Edit: Und die '\r\n' müssen wohl auch nochmal maskiert werden:

$eintrag = "LOAD DATA LOCAL INFILE '160.csv' REPLACE INTO TABLE data FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\\' LINES TERMINATED BY '\\r\\n' (itemID,typeID)";

12.04.2007 23:28 | geändert: 12.04.2007 23:31

8 Marco

Hallo Jörg,

ja die Felder sind durch Komma getrennt und die Texte von " umgeben.

Ich werde es nacher gleich mal versuchen;)

13.04.2007 09:47

9 Marco

Ich habs jetzt ausprobiert. Folgende Fehlermeldung gibt er aus wenn ich es so mache wie Du es mir vorschlägst:

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 '\r\n' (itemID,typeID)' at line 1

Ich habe Dir zur vereinfachung mal einen Ausschnitt des csw Files rauskopiert:

"itemID","typeID","siteID","currencyID","categoryID","bidCount","currentPrice","BINPrice","startTime","endTime","isBuyItNow","isFeatured","hasSubtitle","hasDescrip 341iD2034rWT3,2020cs223n5x91k20Pn502Wk20P4254ght8 fa24rWT4ght8 Gallery4ghlf"end3n5x91k2subTn5x91k2pathString1k2path"st
220101264071,1,77,7,80041,2,4.01,0,2007-04-10 17:30:00,2007-04-15 17:30:00,0,0,0,0,1,1,32209,"Apple eMac G4 256 MB 40 GB 17"" Bild. sehr guter Zuuren3,20",eBay|Computer|Apple|eMac,"999999|160|4599|80041t

13.04.2007 12:00

10 Jörg

Gemäß dem MySQL-Manual sind das die Default-Werte für LOAD DATA:

FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY ''

Das heißt, der Backslash für ESCAPED BY müsste innerhalb des Strings ein weiteres Mal maskiert werden (einmal für PHP, einmal für SQL):

$eintrag = "LOAD DATA LOCAL INFILE '160.csv' REPLACE INTO TABLE data FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\\\' LINES TERMINATED BY '\\r\\n' (itemID,typeID)";

13.04.2007 12:25