Importieren in MySQL mit Java-Programm

Status
Nicht offen für weitere Antworten.

bertram

Mitglied
Guten Tag,

ich schreibe gerade ein Java-Programm, mit dem ich auf eine MySQL Datenbank zugreife.
Eine funktion dieses Programms ist es Dateien zu importieren, es funktioniert auch, bisher gebe ich den Pfad im Java-Quelltext an.
Ich möchte es aber so machen, das sich ein Fenster öffnet und ich mir die Datei zum importieren aussuchen kann, so als wenn ich z. B. in Excel auf "Datei öffnen" klicke.
Dies ganze soll mit einem klick auf ein Button geschehen.

Schon einmal vielen Dank im voraus.

MfG

bertram
 

bertram

Mitglied
Erstmal vielen dank für die rasch Antwort.

Dies ist mein Quellcode:
Code:
Frame frame = new Frame();
JFileChooser chooser = new JFileChooser();
int returnVal = chooser.showOpenDialog(frame);
if(returnVal == JFileChooser.APPROVE_OPTION) 
{
        try
        {
            System.out.println("* Verbindung aufbauen");
            String url = "jdbc:mysql://"+hostname+":"+port+"/"+dbname;
            conn = DriverManager.getConnection(url, user, pw);
        }
        catch (SQLException sqle)
        {
            System.out.println("SQLException: " + sqle.getMessage());
            System.out.println("SQLState: " + sqle.getSQLState());
            System.out.println("VendorError: " + sqle.getErrorCode());
            sqle.printStackTrace();
        }
        
        Statement stmt;
        String query;
        try
        {
            stmt = conn.createStatement();
            query = "LOAD DATA INFILE '"+selFile+"' INTO TABLE importtabelle_rohdaten;";

            stmt.executeUpdate(query);
            stmt.close();
        }
        catch(Exception e)
        {
            e.printStackTrace();
            stmt = null;
        }
        }

Er findet die ausgewählte Datei aber nicht.
Ich bekomme die Fehlermeldung:
java.sql.SQLException: File 'C:Importtabelle_rohdaten.txt' not found (Errcode: 2)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:946)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2870)

Schon einmal vielen Dank im voraus.

MfG

bertram
 

The_S

Top Contributor
Ich weiß zwar nicht, was das Statement "LOAD DATA INFILE" macht, aber imho könntest du mal probieren alle Backslashes in deinem Pfad doppelt zu maskieren bzw. durch normale Slashes zu ersetzen.
 

bertram

Mitglied
Das habe ich mir auch gedacht, da MySQL ja nur normale Slashes zur pfadangabe akzeptiert.

Aber wenn ich eine File mit dem jFileChooser auswähle, setzt er automatisch Backslash für den Pfad ein.
Wie kann ich den jFileChooser den so einstellen, das er die normalen Slashes benutzt?

"LOAD DATA INFILE" ist das MySQL Statement um Dateien in eine MySQL DB zu importieren.
 

The_S

Top Contributor
Code:
String pfad = filechooser.getSelectedFile().getAbsolutePath().replace('\\', '/');
 

bertram

Mitglied
Ich habe gerade erfahren, das noch eine weitere Anforderung an das Programm gestellt wird.
Vorher wurde ein MS Access Programm benutzt, das Programm hat vor dem Import gefragt, welches Zeichen als Trennzeichen benutzt werden soll.
Dies soll jetzt auch im Java-Programm geschehen.

Ich habe dies bezüglich einige Fragen:

1.
Die zu importierende Datei ist eine csv Datei, die Daten sind also nicht mit Tabulator getrennt, so wie es MySQL benötigt.
Wie kann ich das so einstellen, das Tabulator als Trennzeichen verwendet wird?

2.
In der csv Datei haben die Spalten Überschriften, die nicht mit in die Datenbank importiert werden sollen.
Wie kann ich das auslesen der Zeile umgehen?

Hier ist mein Quellcode vom Import:
Code:
Frame frame = new Frame();
        JFileChooser chooser = new JFileChooser();
        int returnVal = chooser.showOpenDialog(frame);
        if(returnVal == JFileChooser.APPROVE_OPTION) 
        {
            File selFile = chooser.getSelectedFile();
            System.out.println("Ausgesuchte Datei: "+selFile.getName()); 
            
            String pfad = chooser.getSelectedFile().getAbsolutePath().replace('\\', '/');
        
            Statement stmt;
            String query;
            try
            {
                stmt = conn.createStatement();
                query = "LOAD DATA INFILE '"+pfad+"'FIELDS TERMINATED BY'   ' INTO TABLE importtabelle_rohdaten;";
                stmt.executeUpdate(query);
                stmt.close();
            }
            catch(Exception e)
            {
                e.printStackTrace();
                stmt = null;
            }
        }

Schon einmal vielen Dank im voraus.

MfG

bertram
 

The_S

Top Contributor
Ohne näheres Hintergrundwissen ob das SQL-Seitig realisierbar ist, würde ich sagen, dass du die Datei auslesen, nicht benötigte Elemente rausschneiden und anschließend die veränderte Datei speichern musst. Um Anschließend deine neue Datei als Vorlage verwenden zu können. Evtl. geht es auch einfacher, aber mir fällt sonst kein Weg ein :(
 

bertram

Mitglied
Code:
JFileChooser chooser = new JFileChooser();
        int returnVal = chooser.showOpenDialog(frame);
        if(returnVal == JFileChooser.APPROVE_OPTION) 
        {
            File selFile = chooser.getSelectedFile();
            System.out.println("Ausgesuchte Datei: "+selFile.getName()); 
            
            String pfad = chooser.getSelectedFile().getAbsolutePath().replace('\\', '/');
            
            Statement stmt;
            String query;
            try
            {
                stmt = conn.createStatement();
                query = "LOAD DATA LOCAL INFILE '"+pfad+"' INTO TABLE importtabelle fields terminated by ';' enclosed by '\"' lines terminated by '\r\n' ignore 1 lines";
                stmt.executeUpdate(query);
                stmt.close();
            }
            catch(Exception e)
            {
                JOptionPane.showMessageDialog(null,"SQLException: "+e.getMessage()+"\n"+e.getStackTrace(),"Fehler",JOptionPane.ERROR_MESSAGE);
                stmt = null;
            }
        }

So habe ich mein Problem gelöst.
 

bertram

Mitglied
Hallo,

Der Import klappt jetzt einwandfrei, nur habe ich jetzt ein paar andere Probleme, die Daten die ich importiert habe, sollen mit schon vorhandenen Daten aus einer anderen Tabelle verglichen und ggf. soll die andere Tabelle dann aktualisiert werden.
Ich beschreibe es mal anhand von meinem Programm, es gibt die Tabelle "Importtabelle_Rohdaten", in der die Daten importiert werden und die Tabelle "Alle_Bestellungen", mit der die Daten aus der Tabelle "Importtabelle_Rohdaten" verglichen und halt ggf. aktualisiert werden sollen.

Meine erste Frage ist:
Wie kann ich in Java zwei MySQL Tabellen vergleichen?

Nachdem die Daten importiert und verglichen wurden, sollen die Daten in der Tabelle "Alle_Bestellungen" aktualisiert werden.

Meine zweite Frage ist:
Wie kann ich in Java die Tabelle "Alle_Bestellungen", anhand der Daten aus der Tabelle "Importtabelle_Rohdaten aktualisieren?

Schon einmal vielen Dank im voraus.

MfG

Bertram
 

DaKo

Bekanntes Mitglied
Wie kann ich in Java zwei MySQL Tabellen vergleichen?
Was ist dein Vergleichskriterium?

Wie kann ich in Java die Tabelle "Alle_Bestellungen", anhand der Daten aus der Tabelle "Importtabelle_Rohdaten aktualisieren?

definiere aktualisieren! Noch nicht vorhandene Datensätze hinzufügen? Bereits vorhandene Datensätze überschreiben?
 

Yzebär

Bekanntes Mitglied
Am einfachsten ist es ein select-Statement zu schreiben, daß dir alle Zeilen der Rohdaten liefert die neu sind (select * from rohdaten r where (count(*) from alle_bestellungen where r.id = id) = 0 ). Wenn du das Resultset nicht direkt über SQL in die andere Tabelle einfügen kannst, mußt du es zeilenweise auslesen und ein insert machen.
Analog machst du es mit den Daten die aktualisiert werden müssen, du änderst das select-Statement so ab, daß du alle Zeilen zurückbekommst, deren ID schon in der Tabelle der Bestellungen vorhanden ist. Dann setzt du zeilenweise ein update ab.

Mit ID ist eine eindeutige Identifizierung gemeint (zB Rechnungsnummer).
 

bertram

Mitglied
Erstmal danke für eure schnelle Hilfe.

1. Meine Vergleichskriterien sind die Spalten "BestellNr" und "Position"(das ist der PK), ich mache am besten eben schnell ein Beispiel.

Alle_Bestellungen
BestNr(PK) Position(PK) Name Bedarfsdatum
123 50 Welle 25.10.2006
456 75 Rohr 24.12.2006

Importtabelle_Rohdaten
BestNr(PK) Position(PK) Name Bedarfsdatum
123 50 Welle 30.10.2006
456 75 Rohr 16.12.2006
789 88 Radio 22.05.2007

Ich habe das Programm jetzt so weit, das es vorhandene Datensätze überschreibt, das heißt die ersten beiden Positionen werden überschrieben.
Aber die dritte Position wird nicht mit in die Tabelle übernommen.

Ich hoffe das Beispiel verdeutlicht mein Problem, und beantwortet alle offenen Fragen.

Hier ist mein Quellcode:

Code:
JFileChooser chooser = new JFileChooser();
        chooser.addChoosableFileFilter(new FileFilter() 
        {
            public boolean accept(File f) 
            {
                if (f.isDirectory()) return true;
                return f.getName().toLowerCase().endsWith(".csv");
            }
            public String getDescription ()
            { 
                return "CSV"; 
            } 
        }
        );
        if (chooser.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION)
        {
            File selFile = chooser.getSelectedFile();
            System.out.println("Ausgesuchte Datei: "+selFile.getName()); 
            
            String pfad = chooser.getSelectedFile().getAbsolutePath().replace('\\', '/');
            System.out.println("Pfad: "+pfad);
            Statement stmt;
            String query;
            try
            {
                stmt = conn.createStatement();

                //Daten werden in die Tabelle "Importtabelle_Rohdaten" geschrieben
                stmt.executeUpdate("LOAD DATA LOCAL INFILE '"+pfad+"' INTO TABLE importtabelle_rohdaten fields terminated by ';' enclosed by '\"' lines terminated by '\r\n' ignore 1 lines");
                
                //Daten aus "Importtabelle_Rohdaten" werden mit den Daten aus der Tabelle "Alle_Auftraege verglichen und uebertragen"
                stmt.executeUpdate("UPDATE alle_auftraege,importtabelle_rohdaten set alle_auftraege.Bedarfsdatum=importtabelle_rohdaten.Bedarfsdatum" +
                        ",alle_auftraege.ABLief=importtabelle_rohdaten.ABLief,alle_auftraege.Bemerkung=importtabelle_rohdaten.Bemerkung " +
                        "where alle_auftraege.BestNr=importtabelle_rohdaten.BestNr and alle_auftraege.Position=importtabelle_rohdaten.Pos");
                
                //Daten werden aus der Tabelle "Importtabelle_rohdaten" wieder entfernt
                stmt.executeUpdate("DELETE FROM importtabelle_rohdaten");
                
                stmt.close();
                
            }
            catch(Exception e)
            {
                JOptionPane.showMessageDialog(null,"SQLException: "+e.getMessage()+"\n"+e.getStackTrace(),"Fehler",JOptionPane.ERROR_MESSAGE);
                stmt = null;
            }
        }

Schon einmal vielen Dank im voraus.

MfG

Bertram
 

Yzebär

Bekanntes Mitglied
Für die dritte Position mußt du ein insert machen. Ich glaube es geht mit select into... also select * into alle_auftraege from import_daten where ... PK nicht in alle_auftraege vorhanden.

Du kannst auch nach deinem UPDATE alle Einträge löschen, die schon übernommen wurden und dann das select * into ohne where ausführen lassen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Excel in mySQL importieren Allgemeine Java-Themen 3
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
berserkerdq2 Wenn ich bei Intelij javafx mit maven importieren will, muss ich das in die pom.xml reintun, aber warum noch in module-info.java? Allgemeine Java-Themen 3
JavaJakob22 Bestimmte HashMap importieren Allgemeine Java-Themen 4
P Adobe Shockwave Player importieren Allgemeine Java-Themen 1
Kirby.exe JDBC Connector von Maven Repo importieren Allgemeine Java-Themen 1
J Bilder lassen sich nicht importieren Allgemeine Java-Themen 3
T javax.script (JavaScript): Nicht-JRE-Packages importieren/nutzen Allgemeine Java-Themen 4
R Importieren von Txt-Dateien in AbstractTableModel Allgemeine Java-Themen 0
J Java - Eigene DLL importieren Allgemeine Java-Themen 25
K 3D-Grafik JOGL Grafiken in 3DS Max importieren Allgemeine Java-Themen 10
M Rein informativ - Daten aus Excel-Tabelle in Java-Programm importieren Allgemeine Java-Themen 3
N php projekt in java importieren Allgemeine Java-Themen 4
D jar importieren? Allgemeine Java-Themen 2
S große CSV-Dateien Importieren. Beste Lösung ?! AWS,S3,Hadoop!? Allgemeine Java-Themen 4
M Zwingen eine statische Methode zu importieren Allgemeine Java-Themen 5
G Projekt aus Firma zuhause importieren? Allgemeine Java-Themen 7
M Eigene .jar in anderes Programm importieren[eclipse] Allgemeine Java-Themen 6
G Zertifikat importieren? Bitte HILFE! Allgemeine Java-Themen 2
G Live-Stream einer WebCam importieren Allgemeine Java-Themen 3
G importieren Allgemeine Java-Themen 14
V dll in Java importieren Allgemeine Java-Themen 2
D ganze packete importieren --> langsam? Allgemeine Java-Themen 9
N MySQL mit Strings Allgemeine Java-Themen 3
B Schnittstelle zwischen MySQL und Apache Allgemeine Java-Themen 8
C MySQL Tabellen sortieren. Allgemeine Java-Themen 33
O Zugriff auf mySQL ohne JDBC Allgemeine Java-Themen 3
V Maven Maven ClassNotFoundException MySQL JDBC Treiber Allgemeine Java-Themen 1
G Eclipse Java findet MySQL Driver nach export nicht mehr Allgemeine Java-Themen 2
R Praktikums Projekt Java vs MySQL Allgemeine Java-Themen 91
C JPA und mysql Allgemeine Java-Themen 3
D falsche Zeile aus JTable in MySQL gelöscht Allgemeine Java-Themen 6
D Daten in MySQL-Datenbank schreiben Allgemeine Java-Themen 13
J javaFX mySQL Allgemeine Java-Themen 3
B MySQL Eintrag erstellen Allgemeine Java-Themen 3
P MYSQL Datenbank Dump einspielen Allgemeine Java-Themen 1
F eclipse, texlipse, R und mysql Allgemeine Java-Themen 2
S WebApp MySQL Connection Loss Allgemeine Java-Themen 10
H Tablemodel und mysql Allgemeine Java-Themen 8
T Datumsformat für MySQL Allgemeine Java-Themen 4
S ANT mysql treiber einbinden Allgemeine Java-Themen 4
F Ärger mit mySQL Allgemeine Java-Themen 3
S Java Methode um Daten aus MySQL auslesen Allgemeine Java-Themen 11
neurox Tutorial: Hibernate mit MySQL (erste Schritte) Allgemeine Java-Themen 34
M JAVA Timestamp aus Mysql Allgemeine Java-Themen 4
T MySQl Datenbank als Array ausgeben Allgemeine Java-Themen 11
hdi Applet, JavaScript, PHP, mySQL -> Was brauch ich? Allgemeine Java-Themen 3
E MySQL-Datenbank <-> HashMap/TreeMap Allgemeine Java-Themen 1
H Daten aus MySQL datenbank auslesen und in ArrayList stecken Allgemeine Java-Themen 8
G mySQL und JTable Allgemeine Java-Themen 7
G MySql+Java+backup Allgemeine Java-Themen 23
I JAVA+ MySQL locales statement? Allgemeine Java-Themen 2
G mysql datum umwandeln mittels jsp Allgemeine Java-Themen 10
G Mysql --> Datumsformat Allgemeine Java-Themen 7
C Umlaute mysql Allgemeine Java-Themen 3
V MySql db unter Java zum laufen bringen. Allgemeine Java-Themen 2
C Rechte unter WinXP, MySQL-Server per Runtime herunterfahren? Allgemeine Java-Themen 6
G Datum in MySQL Timestamp umwandeln? Allgemeine Java-Themen 10
G Daten aus MySQL-Datenbank an JFreeChart übergeben Allgemeine Java-Themen 3
G MySQL-Problem (LOAD DATA INFILE) Allgemeine Java-Themen 5
F Threadsicherheit von MySQL-Verbindungen Allgemeine Java-Themen 8
D Hat Java eine Library um JavaScript auszuwerten? Allgemeine Java-Themen 2
Zrebna Wieso sind eigentlich JUnit-Tests in src/test/java platziert - nur Konvention? Allgemeine Java-Themen 7
N LlaMA, KI, java-llama.cpp Allgemeine Java-Themen 39
V Java-Codierungsherausforderung: Navigieren durch die Macken der Datumsmanipulation Allgemeine Java-Themen 2
E Output Fehler (Java-Programm Kuchen) Allgemeine Java-Themen 11
M java: unexpected type Allgemeine Java-Themen 2
harrytut Java Input/Output Tests Junit Allgemeine Java-Themen 3
B Java Discord bot auf ein Root Server? Allgemeine Java-Themen 1
BetziTheRealOne Java PKIX path building failed as non Admin Allgemeine Java-Themen 15
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
KonradN Java 21 Release Allgemeine Java-Themen 5
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
K Java Anwendung machen Anleitung Allgemeine Java-Themen 5
G java.io.listFiles() Allgemeine Java-Themen 3
8u3631984 Frage zu Java Streams min / max Allgemeine Java-Themen 17
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
K Java-Projekt Allgemeine Java-Themen 11
K Java-Projekt Allgemeine Java-Themen 0
ruutaiokwu Welcher Browser unterstützt heutzutage noch Java Applets? Allgemeine Java-Themen 5
Jose05 Java-Klasse im extra cmd-Fenster ausführen Allgemeine Java-Themen 3
rode45e Java Threads Allgemeine Java-Themen 4
G java.io.listFiles() Allgemeine Java-Themen 2
N Java Dynamic Proxy Allgemeine Java-Themen 3
N Leichte Java Gegner Ki Allgemeine Java-Themen 10
A Java modul Problem Allgemeine Java-Themen 4
Thomasneuling Java Jar datei erstellen, von Projekt, dass auch Javafx Dateien, FXML Dateien und CSS Dateien, sowie Bilder enthält? Allgemeine Java-Themen 14
V Funktionale Schnittstelle in Java Allgemeine Java-Themen 3
OnDemand Java String in Hashmap als Key NULL Allgemeine Java-Themen 27
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
KonradN Java 20 am 21. März Allgemeine Java-Themen 1
O Java Website Stock Bot Allgemeine Java-Themen 3
J Front-/Backend in Java Allgemeine Java-Themen 14
doopexxx JAVA Google Webcrawler Allgemeine Java-Themen 1
J JavaScript innerhalb eines Java Projekts ausführen Allgemeine Java-Themen 2
A Java Programm erstellen hilfe Allgemeine Java-Themen 10
G java.lang.NoClassDefFoundError: org/aspectj/lang/Signature Allgemeine Java-Themen 2
lalex1491 Java Aktienkurse nachfragen Allgemeine Java-Themen 4
J Class to link Java Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben