CSV Datei mit DB Inhalt vergleichen

Lia

Bekanntes Mitglied
Schönen Abend an alle :)
habe ein kleines Problem...

Nutze myBatis (wo sich in der XML Datei meine Sql Statements) befinden. Desweiteren habe ich eine Datenbankanbindung zu einer Oracle Datenbank. Für die Applikation nutze ich Java.

Ich habe eine CSV Datei die Datensätze besitzt (nutze in der Java Applikation das CSV Framework (zb. CSVRecord record.get(0) damit hole ich mir die einzelnen werte aus den Spalten..), die nicht in der Datenbanktabelle vorhanden sind. Also möchte ich quasi alle Datensätze die in der CSV Datei sind mit der in der DBTabelle vergleichen. Für den Fall, das ein kompletter neuer Datensatz hinzugeügt wurde oder das sich vlt bei einem Datensatz mit einem PK nur eine Spalte geändert hat..

Habe in etwa so angefangen:

Code:
(CSVRecord record : csvliste)

(Test test : dbtestliste)

if(!record.get(0).contains(test)) && record.get(1).contains...

ich verstehe das einfach nicht, wie ich die einzelnen Spalten aus der db mit der csv datei vergelcihen soll, ob sich da evtl nur ein wert geändert hat oder ein ganzer Datesatz hinzugefügt wurde.. bin echt total am verzweifeln.

Kann mir vlt jemand helfen? Tipps geben?

LG
 

Lia

Bekanntes Mitglied
Richtig, sie haben einen PK. Ja genau. Aber ich habe es wirklich versucht und es funktioniert einfach nicht..
 

Lia

Bekanntes Mitglied
@mrBrown .. wie kann ich die denn alle miteinander vergleichen ?? Also irgendwie funktionieren bei mir die schleifen nicht und der Aufbau der if befehle
 
K

kneitzel

Gast
Also Du hast eine csv Datei mit Datensätzen und willst nun für jeden dieser Datensätze entweder den vorhandenen Datensatz in einer Tabelle ändern oder ein neuen Datensatz einfügen?

Das sollt bei Oracle mit einem MERGE Befehl gehen. Dazu habe ich aber auch schon einen Link im anderen Thread geschrieben: https://www.java-forum.org/thema/mybatis-datenbankabfragen-in-java.185425/

Eine andere Möglichkeit wäre über stored procedures - ebenfalls in meiner Antwort im anderen Thread zu finden.

Wenn Du das alles manuell in Java machen willst:
Für jeden Datensatz aus der CSV Datei schaust Du in der Datenbank nach einem existierenden Eintrag (per id). Gibt es einen, prüfst Du alle Werte, ob einer geändert wurde -> Entity anpassen und updaten. Wurde kein Datensatz gefunden, dann fügst Du einen neuen ein.
CRUD Operationen mit myBatis: https://www.javacodegeeks.com/2012/...rations-and-mapping-relationships-part-1.html
 

Lia

Bekanntes Mitglied
Ja aber ich kriege das irgdenwie nicht hin zu programmieren :( also keine Ahnung wie ich die For schleifen da machen soll und alles bin total verzweifelt
 
K

kneitzel

Gast
Ich habe Dich jetzt so verstanden, dass du zu der dritten Lösung, alles in Java zu machen, tendierst. Daher wäre mein Vorschlag:

Gib einmal den Code, den Du bisher hast. Egal ob er funktioniert oder nicht.(Sag ggf. dabei, was geht oder nicht geht)
- Kannst Du die CSV Datei schon einlesen, so dass Du die Daten jeden Datensatzes hast?
- CRUD auf der Tabelle hast du, so dass Du Datensätze über die ID lesen und ändern und auch neue Datensätze einfügen kannst?
Dann können wir Dich führen, in dem wir fehlende oder falsche Dinge erläutern. Wichtig ist, dass Du versuchen musst, klar zu sagen, was Du verstehst oder nicht verstehst. Es ist nichts schlimmes, wenn eine Antwort unverständlich für Dich ist. (Insider für die Anderen: Kann nicht schwerer sein als bei Heyoka :))
 

Lia

Bekanntes Mitglied
Also den Abschnitt hier komme ich nicht weiter:

for(CSVRecord record: csvliste)
for(test testdb:dbliste)
If(record.get(0).contains(testdb.getID)// also falls es schon vorhanden ist ggf Update den Datensatz

If(!(record.get(0).contains(testdb.getID))

Neuer Datensatz
Oder??
 
K

kneitzel

Gast
Kannst Du nicht mehr Code teilen? Was ist csvliste? Was ist dbliste?

Ich hätte da zum Beispiel schon was ganz anderes erwartet:

Java:
for(CSVRecord record: csvliste) {
    DBType dbRecord = dataLayer.getRecordById(record.get(ID_OF_RECORD));
    if (dbRecord == null) {
        // Create and insert new DBType instance
    } else {
        // Check dbRecord and update it if required.
    }
}

Aber ich kenne Deine Typen ja nicht. Du nutzt myBatis, d.h. Du solltest zu der Tabelle eine Java Entity haben (DBType habe ich die einfach mal in meinem Schnipsel genannt). Du solltest einen Data Layer haben (habe die Instanz davon mal dataLayer genannt bei mir) mit einer Funktion, da einen Datensatz per ID zu lesen. (also ein get....ById Aufruf). ID_OF_RECORD habe ich mal eine Konstante genannt. In der CSV Datei muss die ID ja irgendwo stehen. Magic Numbers im Code will ich vermeiden. ==> Hier muss man ggf. noch eine Konvertierung vornehmen, also wenn die ID ein long ist, aber Du die ID in CSVRecord als String hast, dann musst Du die evtl. erst parsen....)
Dann die Prüfung, ob myBatis da was gefunden hat. myBatis liefert meines Wissens nach null zurück, wenn der Datensatz nicht gefunden wurde. Daher dann diese Prüfung. Code für das Erstellen und Einfügen sowie für das Update habe ich hier erst einmal außen vor gelassen.

So wäre also aus meiner Sicht der mögliche Aufbau des Codes - basierend auf Deinem Schnipsel.

==> Hier scheint es so zu sein, dass die CSV Datei komplett in den Speicher geladen wird. Bei großen CSV Dateien kann das problematisch sein und CSV Dateien sind eigentlich oft gut Zeile für Zeile lesbar. Aber das lassen wir erst einmal außen vor. Das kann man ggf. später auch noch anpassen.
 

Lia

Bekanntes Mitglied
L
Vielen vielen vielen Dank !!!!!
Ja genau so habe ich es nun auch iwie implementiert. Insert Funktioniert im Else Zweig habe ich jede einzelne Spalte angesprochen ob sie ungleich dem Wert in der DB ist , sobald ja,setzt er meine bool variable auf true und springt in den Update Zweig

If (change==true)
Testmapper.updatebyprimarykey(id)

Das problem Ist, das er das Update nicht durchführt...
 
K

kneitzel

Gast
Zeigst Du mit bitte den genauen Code? Also wirklich die ganze Funktion und so Du Instanzvariablen nutzt, dann deren Deklaration.
 

Lia

Bekanntes Mitglied
Hi @kneitzel :) muss es mit dem Handy abtippen also der Update Bereich sieht so aus :

Test testid = testmapper.getbyprimarykey(record.get(0));

If(!testid.getStation().equals(record.get(1)){
Testid.setStation(record.get(1));
change==true
}

if (change)
testmapper.updatebyprimarykey(testid);
..// so mache ich das für alle spalten vergleiche sie also.

Er findet die ungleichen Sachen aber aktualisiert sie nicht in der DB :/
 
K

kneitzel

Gast
Du willst change setzen und nicht vergleichen wenn er einen Unterschied feststellt. == ist der Vergleich, = die Zuweisung.

Also change==true durch change=true; ersetzen (Da fehlte auch ein ; aber das könnte das Abtippen sein. Das == aber prinzipiell auch ...)
 
K

kneitzel

Gast
Also fehlt schlicht ein session.commit()? Wenn er die Mapper Aufrufe ausführt aber kein commit, dann fehlt evtl. einfach ein commit Aufruf auf der Session?
 

Lia

Bekanntes Mitglied
Hab ich alles gemacht es funktioniert einfach nicht. In den jeweiligen (! Blocken ) geht er rein zeigt auch die ungleichen Elemente an also gibt sie aus.. aber gibt es nicht in der DB aus..
 
K

kneitzel

Gast
Ich würde Dich bitten, den entsprechenden Code einmal per copy & paste hier zu zeigen.
- Du liest CSV Elemente korrekt ein.
- Du kannst Dir das zugehörige Element aus der Datenbank holen über den Mapper.
- Du kannst CSV Element und DB Element vergleichen und mittels Setter die Werte des DB Elements anpassen.
- Du rufst update vom Mapper mit dem veränderten DB Element auf und danach auch commit() von der SqlSession.

Hast Du den Mapper Unit-Getestet, d.h. der ist korrekt (nicht, dass das update nicht korrekt definiert ist).

So die Fehler, die ich angemerkt habe, im Code nicht enthalten sind, dann sollte es eigentlich funktionieren.
 
K

kneitzel

Gast
Wenn man Code schreibt, dann schreibt man meist auch sogenannt Unit Tests. Bedeutet Deine Frage, dass ihr derzeit keine Unit-Tests habt oder weißt Du nur nicht, wie Du da etwas Unit-Testen kannst?

Also wir arbeiten bei unserer Entwicklung meist mit einer Entwicklungsdatenbank. Und dann können wir in unseren Unit-Tests Datensätze anlegen, lesen, verändern und auch löschen. So stellen wir sicher, dass der Code, den wir schreiben, auch funktioniert.

Falls Ihr keine Unit Tests habt: Hast Du eine nicht produktive Datenbank? So dass Du eine kleine Applikation schreiben kannst, die Deinen Mapper nutzt, um einen Datensatz zu lesen, eine Property ändert und dann zurück schreibt?

Hintergrund ist, dass man am Besten immer kleine Teile testet und prüft. Wenn man nur das große Ganze testen will, dann ist es ggf. schwer, den Fehler genau zu lokalisieren.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Gelöst: JavaDB - Derby Inhalt in Jar Datei speichern Datenbankprogrammierung 5
M Datenbank Zugraff nach Umwandlung in .jar-Datei nicht mehr möglich Datenbankprogrammierung 4
D H2 schema-Datei ausführen Datenbankprogrammierung 22
L Oracle SQL Inserts via Client vs SQL Datei via ScriptRunner Datenbankprogrammierung 6
J JAR-Datei und Datenbank Datenbankprogrammierung 8
S Verbindung von einer Excel Datei zu Java Datenbankprogrammierung 2
J Jar-Datei stellt keine Datenbankverbindung her Datenbankprogrammierung 3
F Auslesen einer .dbf-Datei, Zuordnung Index Datenbankprogrammierung 0
T Datei auf Desktop ausgeben Datenbankprogrammierung 22
W Daten aus einer Datei von einem VServer auslesen Datenbankprogrammierung 1
M HSQLDB .Script-Datei entfernen oder sperren Datenbankprogrammierung 18
M MySQL JSON-Datei auf Datenbank anwenden Datenbankprogrammierung 17
V SQLite Performance: 1 Datei mit einzelnen Einträgen gegenüber SQLite Datenbankprogrammierung 7
M Verbindung von Java Programm zur Acccess Datenbank (mdb-Datei) Datenbankprogrammierung 0
J SQL Datei einlesen/beschreiben Datenbankprogrammierung 0
F JPA persistence.xml mit EXTERNER Config Datei Datenbankprogrammierung 0
C VDF Datei als Datenbank genutzt!!! Datenbankprogrammierung 5
L SQL2SMO JAR-Datei zum Laufen bringen Datenbankprogrammierung 0
Androbin [Serializing] Mehrere Objekte in einer einzigen Datei speichern Datenbankprogrammierung 1
P Derby/JavaDB Csv Datei für dieses Musterprogramm Datenbankprogrammierung 12
D [xBaseJ] Datei kann nicht geöffnet werden Datenbankprogrammierung 2
L Werte in Datei speichern Datenbankprogrammierung 16
D Datenbank oder XML Datei Datenbankprogrammierung 3
M HSQLDB oder DERBY - warum SCRIPT Datei? Datenbankprogrammierung 0
S SQL-Abfrage, Filewriter .txt Datei Datenbankprogrammierung 2
T 3 GB Große CSV Datei einlesen und in SQL-DB schreiben Datenbankprogrammierung 12
T Datei import und Datumsformat Datenbankprogrammierung 4
D Derby Datenbank bei Export zu JAR-Datei nicht möglich Datenbankprogrammierung 8
K SQLite CSV-Datei einlesen in eine Datenbank Datenbankprogrammierung 7
E csv datei in JTable einlesen Datenbankprogrammierung 3
E Datei Zippen und an DB schicken Datenbankprogrammierung 7
N Oracle txt. Datei auslesen-> verändern-> einlesen Datenbankprogrammierung 7
I Zugriff auf Datenbank nach Erstellen einer Executable Jar Datei verweigert Datenbankprogrammierung 10
D MySQl Treiber in .jar Datei einbinden, Bukkit Datenbankprogrammierung 2
M Datenbank-Datei Datenbankprogrammierung 10
bluerob MimeMessage .getFrom()[0]; liest eml-Datei nicht Datenbankprogrammierung 7
achillesat ausgelesene Datei in Datenbank schreiben Datenbankprogrammierung 9
O MySQL sql Datei einzelner Tabellen erzeugen (über Java Programm) Datenbankprogrammierung 6
F Große Datei in MySQL importieren Datenbankprogrammierung 10
H Derby SQL-Abfragen in Datei abspeichern Datenbankprogrammierung 2
S passwortgeschützte Excel-Datei einlesen Datenbankprogrammierung 3
S Schnellste Methode Datei aus Datenbank herstellen Datenbankprogrammierung 7
C XLS Datei aus Datenbank erstellen Datenbankprogrammierung 14
H Datenbank in Datei speichern / laden Datenbankprogrammierung 8
M FindBugs und PreparedStatement aus einer Datei lesen Datenbankprogrammierung 11
H CSV Datei in MSSQL DB oder doch SQL Script Datenbankprogrammierung 11
N Problem mit dem Importieren der csv- u. txt-Datei Datenbankprogrammierung 3
Dragonfire Daten aus jsp Datei in datenbank speichern Datenbankprogrammierung 15
M Tabelle in Access Datei mit JDBC generieren Datenbankprogrammierung 3
N csv datei erstellen Datenbankprogrammierung 2
S BLOB in Datei speichern Datenbankprogrammierung 8
S projektplanung mit csv datei Datenbankprogrammierung 2
K jar Datei startet nicht aufgrund Firebird(?) Datenbankprogrammierung 3
D Access Datenbank in .jar-Datei Datenbankprogrammierung 51
H Wie kann ich eine Datenbank Connection aus XML-Datei lesen! Datenbankprogrammierung 2
M H2 DAtenbank in .sql datei schreiben/abfragen ? Datenbankprogrammierung 3
A Auslesen von Werten aus der DB in eine csv-Datei Datenbankprogrammierung 4
T Wie kann ich Blobs (Bilder) in einer Datei speichern? Datenbankprogrammierung 2
A Auslesen aus einer csv-Datei Datenbankprogrammierung 2
A Einlesen einer csv-Datei in eine H2-Datenbank Datenbankprogrammierung 3
A Probleme beim Schreiben in eine CSV-Datei aus einer H2-DB Datenbankprogrammierung 2
G Import einer csv-Datei in eine H2-Database Datenbankprogrammierung 12
N csv datei in PostgreSQL datenbank einlesen Datenbankprogrammierung 1
M Mit Java .txt-Datei in eine Datenbank einlesen lassen Datenbankprogrammierung 33
ARadauer datenbank in datei sichern Datenbankprogrammierung 4
B HSQLDB und die log-Datei Datenbankprogrammierung 10
S [Hibernate] Map in Map - Wie sieht Mapping Datei aus? Datenbankprogrammierung 10
F Probleme mit Jar Datei Datenbankprogrammierung 3
T Datei (Blob) mit verknüpfter Software öffnen? Datenbankprogrammierung 4
M Problem: Große Datei in MySQL DB importieren. Datenbankprogrammierung 12
P ODBC verbindung Java soll auf access mdb datei zugreifen Datenbankprogrammierung 2
S SQLite oder RDBMS als Datei(nicht Client/Server) Datenbankprogrammierung 5
G .jar - Datei erzeugen (Was beachten?) Datenbankprogrammierung 2
R Mit JAR-Datei ist MySQL-Treiber nicht auffindbar Datenbankprogrammierung 10
Y Problem mit Ablage einer Datei in einer Datenbank als BLOB Datenbankprogrammierung 6
B Wie kann ich eine Jtable mit Inhalt einer SQL Abfrage füllen Datenbankprogrammierung 14
L MySQL Vergleichen von Array-Inhalt, Ausgabe gleicher Daten Datenbankprogrammierung 3
L Tabelle mit Inhalt füllen Datenbankprogrammierung 2
I Inhalt einer hsqldb anzeigen Datenbankprogrammierung 1
T Fehler beim ausgeben von Tabellen Inhalt Datenbankprogrammierung 9
N MySQL MYSQL Inhalt an JTable übergeben. Datenbankprogrammierung 11
B MySQL Zwischenspeichern von DB-Inhalt Datenbankprogrammierung 8
A Wie Tabelle auf bestimmten Inhalt überprüfen? Datenbankprogrammierung 7
T Inhalt einer Datenbanktabelle autom. in XML ausgeben Datenbankprogrammierung 7
T ResultSet-Inhalt in Arrays schreiben Datenbankprogrammierung 3
G Inhalt eine Clob Feldes zw. zwei DB's kopieren Datenbankprogrammierung 2
T Inhalt von Blob in Console ausgeben Datenbankprogrammierung 2
P Inhalt einer Variable in Datenbank schreiben Datenbankprogrammierung 13
V DB-Inhalt in JTable Datenbankprogrammierung 5
C zwei Strings vergleichen Datenbankprogrammierung 13
S MySQL Datenbankabfrage mit Eingabe aus Textfeld vergleichen Datenbankprogrammierung 4
MaxG. Datenbank werte vergleichen Datenbankprogrammierung 5
C Datenbankeinträge vergleichen Datenbankprogrammierung 16
V SQLite 2 Tabelle vergleichen und alle unterschiede rausgeben Datenbankprogrammierung 1
V SQLite 2 Tabellen vergleichen und nur Unterschiedliche Sätze rausgeben. Datenbankprogrammierung 31
Paul15 Tabelle vergleichen Datenbankprogrammierung 15
ruutaiokwu sql server 2008 stored procedures automatisiert vergleichen Datenbankprogrammierung 2
P Listen Vergleichen JPA Criteria Datenbankprogrammierung 2
K Zwei Datenbanken miteinander auf Unterschiede vergleichen Datenbankprogrammierung 2
T 2 Tabellen aus 2 Datenbanken miteinander vergleichen Datenbankprogrammierung 6

Ähnliche Java Themen


Oben