importierte Daten umwandeln
antoaneta
- datenbank
Hallo,
ich hab das folgende Problem:
ich muss von einer CSV-Datei Daten in eine MySQL Datenbank importieren.In der CSV-Datei habe ich Spalte Preise (Format: 2,564) und Datum( Format: dd.mm.yyyy). Ich mache den Import mit LOAD DATA INFILE.
Damit ich mit der Preis auch rechnen kann ist in der Datenbank der Format für Preis DOUBLE. In java hab ich eine Methode geschrieben, die mir vom Format String 2,564 in Double 2.564 die Preise umwandelt.
Ich hab das Problem: wenn ich LOAD DATA INFILE ausführe mit
Statement st = executeUpdate(Load data...)
und dann die Methode costUpdate(),komme ich überhaupt zu der Ausführung der Methode costUpdate,weil ich die Fehlermeldung :
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Daten abgeschnitten für Spalte 'cost' in Zeile 1
Die Daten in Spalte cost in der DAtenbank sind 0, weil die vom Typ Double sind, aber ich will CSV importieren und gleich umwandeln.
Geht das ?
Die Daten in Spalte cost in der DAtenbank sind 0, weil die vom Typ Double sind, aber ich will CSV importieren und gleich umwandeln.
Würde ich nicht empfehlen, besser:
1.) eine Tabelle anlegen mit reinen char-Werten der benötigten Längen
2.) eine zweite Tabelle anlegen mit den gewünschten Datenfeldtypen
2.) dann "mit SQL" und entsprechenden Typumwandlungsfunktionen die zweite Tabelle mit Daten der ersten befüllen
Gibt es keine andere Möglichkeit?
ich werde jeden Monat eine neue CSV-Datei importieren. Die Tabellen werden schon groß werden. Wenn ich 2 Tabellen erzeuge soll ich die eine (mit den char Werte) immer danach löschen.
Gruß,
Antoaneta
Gibt es keine andere Möglichkeit?
Klar, die Importroutine genau mit den zu erwartenden Datenwerten beliefern. Aber ist das auch möglich?
ich werde jeden Monat eine neue CSV-Datei importieren. Die Tabellen werden schon groß werden. Wenn ich 2 Tabellen erzeuge soll ich die eine (mit den char Werte) immer danach löschen.
Du kannst das ja alles automatisieren und die nichtübernehmbaren Werte loggen lassen.
Gibt es keine andere Möglichkeit?
Klar, die Importroutine genau mit den zu erwartenden Datenwerten beliefern. Aber ist das auch möglich?
Ich hab mir gedacht, dass ich auf load data infile verzichte und die CSV-Date zeilenweise auslese. Nach jeder Zeile werde ich mit INSERT die Werte in die DAtenbank eintragen. So kann ich die gleich umwandeln. Ich wollte load data infile benutzen,weil die Performance besser ist, aber das brint mir jetzt nicht viel :)
Ich hab mir gedacht, dass ich auf load data infile verzichte und die CSV-Date zeilenweise auslese. Nach jeder Zeile werde ich mit INSERT die Werte in die DAtenbank eintragen. So kann ich die gleich umwandeln. Ich wollte load data infile benutzen,weil die Performance besser ist, aber das brint mir jetzt nicht viel :)
Ein Massenimport von Daten, bspw. direkt aus CSV-Dateien heraus, kann nie so spezifisch sein, wie der zeielenweise Import und das anschliessende individuelle INSERT.
Allerdings stösst Du bei grossen Datenmengen schnell auf Performanceprobleme. Ein RDBMS ist _nicht_ dafür angelegt zigtausendfache INSERTs auszuführen.
Sind es also wenig Daten wäre Dein Vorgehen OK, ansonsten solltest Du wirklich so vorgehen wie von mir vorgeschlagen.
Hallo antoaneta !
Kanns sein, dass MySQl das "," in der "cost"spalte als Delkimiter auffasst ?
;-)
Hast Du mal versucht die Felder beim Import zu benennen ?
Oft fehlt - aus naheliegenden Gruenden - beim Bulkimport ja der PK.
Wg. Performance bei einem evtl. Workaround :
Wenn Du die Datei komplett erstmal in EINEN Puffer liest und dann in EINER Connection satzweise inserts machst ( ggf ohne Transaktion ) koennt's eigentlich mit dem (Bulk)-Import als LOAD DATA nicht wesentlich schneller sein.
JDBC ist ja bei Dir wohl so oder so im Spiel.
Gruesse
Holger
Hi Holger,
- Kanns sein, dass MySQl das "," in der "cost"spalte als Delkimiter auffasst ?
;-)- Hast Du mal versucht die Felder beim Import zu benennen ?
Oft fehlt - aus naheliegenden Gruenden - beim Bulkimport ja der PK.
also ich hab in der Datenbank ein Feld id und ich erzeuge Ihn automatisch (auto increment). in LOAD DATA INFILE gebe ich die spalten, wo die daten eingefügt werden sollen. Eigentlich aber bekomme ich in der ID-Spalte der erste Eintrag, der von der CSV-Datei kommt. Der wird auch incrementiert.
- Hast Du mal versucht die Felder beim Import zu benennen ?
Wie kann ich das machen?
Gruß
Antoaneta
Milady , mich deucht Euch dies hernieden schon zur werten Kenntnis gebracht zu haben
Always a pleasure to be at your service !
Holger