Iterieren über eine CSV Datei

Lia

Bekanntes Mitglied
Hi ihr lieben:)

habe eine verschachtelte Schleife. Die sind Schleife iteriert über eine CSV Datei und die andere über die db Tabelle.

Java:
for(CSVRecord r : csvline)
    for (customer c : listCustomer)
        if (!c.getID.equals(r.get(0))){

        }

Der Datensatz aus der CSV soll in die db übertragen werden sobald sie(basierend auf der ID) nicht in der DB vorhanden ist. Iwie tut er es bei mir ständig übertragen auch wenn sie schon drin ist.

LG
 
Zuletzt bearbeitet von einem Moderator:

mrBrown

Super-Moderator
Mitarbeiter
Naja, überleg dir mal, wann die Bedingung des if's zutrifft: Dann, wenn irgendein Customer nicht die gleiche ID wie der jeweilige CSVRecord hat.



Anstatt das so über verschachtelte Schleifen zu lösen, überleg dir, wie du das auf Methoden aufteilen kannst :)

1) "Der Datensatz aus der CSV soll in die db übertragen werden sobald ..."
2) "sie [ein Datensatz] (basierend auf der ID) nicht in der DB vorhanden ist"
 
K

kneitzel

Gast
Und da solltest Du Dir auch überlegen, wie Du die Daten generell vorhalten möchtest. Da die Datenmenge ja prinzipiell sehr hoch sein kann, ist ein mögliches Pattern, dass Du für jede Zeile der CSV Datei eben eine Query auf die Datenbank machst um den Kunden zu laden.
-> Kunde kann nicht gefunden werden: Neu Anlegen
-> Kunde wurde geladen: Daten vergleichen und ggf. ein Update Befehl.

Was man aber auch machen kann um das alles etwas zu optimieren:
Für jeden Eintrag in der CSV Datei wird ein SQL Befehl ausgeführt (Stored Procedure macht da oft Sinn), welcher dann halt prüft, ob ein neuer Eintrag erzeugt oder ein bestehender aktualisiert werden muss. Einige Datenbanken haben dafür sogar eigene Befehle (z.B. bei MySQL sowas wie hier: http://www.mysqltutorial.org/mysql-insert-or-update-on-duplicate-key-update/ ).

Viele Grüße,

Konrad
 

Lia

Bekanntes Mitglied
Viele danke für eure antworten. Das kann doch nicht so schwer sein , irgendwie Versuche ich es als, aber es funktioniert nicht.

Java:
for(CSVRecord record : csvliste){
    for(CustomerInfo c : listCustomer){
        if(!record.get(0).equals(c.getID))){
            // Fehlende ID bitte einfügen
        Else{ keine neuen Einträge})
        //If ID exists update

Habe nicht mehr Code zum zeigen

Danke euch.
 
Zuletzt bearbeitet von einem Moderator:
K

kneitzel

Gast
Der Code ist doch so auch Unsinn (siehe #2, aber ich formuliere es auch noch einmal aus):
Für jeden record in der csvliste schaust Du:
-> für jeden CustomerInfo c aus listCustomer machst Du:
--> hier kommt jetzt die Prüfung...

Also überleg geh doch einfach einmal durch, was das macht. csvliste hat die Elemente a, b, c und d.
listCustomer hat auch die Elemente a, b, c, und d
Nun nimmst Du dir von der csvListe das erste element: a
-> Nun gehst du die listCustomer durch:
--> a==a -> Else Zweig wird gemacht
--> a!=b -> Du willst a einfügen
--> a!=c -> Du willst a einfügen

Bitte gewöhne Dir an, dass Du bei der Softwareentwicklung sauber alles ausformulierst. Geh vom Groben in das Feine!

Also was willst Du machen? Dein Pseudo-Code ist doch eher das:
Lese csvDatei
Für jede Zeile in der csvDatei:
- Prüfe, ob der Kunde bekannt ist
--> Kunde bekannt: Aktualisiere vorhandenen Kunden
--> Kunde nicht bekannt: Füge den Kunden neu hinzu

Und das kannst du dann in Java Code übersetzen. Aber bitte eine 1:1 Übersetzung so weit wie es geht!
Java:
for(CSVRecord record : csvliste) {
    if (isCustomerKnown(customerList, record)) {
        updateCustomer(customerList, record);
    } else {
        insertCustomer(customerList, record);
    }
}
Das Ganze von mir aus auch Objektorientiert, customerList ist dann von einer Klasse, die Du geschrieben hast und auch die CsvList liefert keine Rohdaten mehr sondern natürlich brauchbare instanzen von z.B. Customer.

Java:
for(Customer customer: customerCsvList) {
    if (customerList.contains(customer)) {
        customerList.update(customer);
    } else {
        customerList.insert(customer);
    }
}

Und dann hast Du kleine Funktionen, die Du alle schreibst. Und jede Funktion solltest Du für sich testen, so dass Du sicher sein kannst, dass sie funktioniert. Und der Code ist plötzlich direkt lesbar und verständlich....
 

Lia

Bekanntes Mitglied
Vielen vielen Dank für deine ausführliche Antwort

Habe es nun so implementiert:

Java:
for(CSVRecord c1 : csvliste){
    if(customerliste.contains(c1)){
        //Vorhanden Update
    Else{
        //Create new
    }
}

Problem Ist nur das er jetzt immer neu hinzufügt also immer in den Else springt soll er ja nicht sondern ggf. "updaten"

Sorry ich weiss das sind total doofe fragen
 
Zuletzt bearbeitet von einem Moderator:
K

kneitzel

Gast
Also hinter den Aufrufen muss immer eine konkrete Implementation stecken.

Du darfst nicht die prozedurale Lösung mit der Objektorientierten durcheinander werfen. Du hast uns jetzt noch keine Details gegeben, was denn nun genau customerliste ist. Ich vermute aber, dass Du hier noch mit "raw data", also mit Java Basis Klassen arbeitest und keine objektorientiere Lösung für Dich erstellt hast.

Das heisst, Du hast sowas wie ein List<Customer> customerliste
Und wenn Du da eine Liste von Customer hast, dann wird da wohl kaum ein CSVRecord drin sein.

Deshalb nimm evtl. erst einmal den ersten, prozeduralen Vorschlag und implementiere dann gewisse Funktionen selbst.

So könnte die Funktion isCustomerKnown(customerList, record) z.B. so in der Art implementiert sein:
Code:
public static bool isCustomerKnown(List<Customer> customerList, CSVRecord record) {
    for (Customer customer: customerList) {
        if(!record.get(0).equals(c.getID))) return true;
    }
    return false;
}
Sprich: Du gehst alle Customer durch und machst den Check. Wenn du einen passenden gefunden hast, dann gibst du true zurück. Am Ende, wenn nichts passendes dabei war, gibst du false zurück.
 

White_Fox

Top Contributor
Nur mal so: Es gehört zum guten Ton, Codeschnipsel so zu posten:


[CODE=java] <- Siehe hier ###
for(CSVRecord c1 : csvliste){
if(customerliste.contains(c1)){
//Vorhanden Update
Else{
//Create new
}
}
[/CODE] <- Und hier ###


Wenn du dazu noch ein paar Einrückungen spendierst wird daraus:
Java:
for(CSVRecord c1 : csvliste){
    if(customerliste.contains(c1)){
        //Vorhanden Update
    } // <-- von mir hinzugefügt
    Else{
        //Create new
    }
}

Damit sind deine Codeschnipsel erheblich besser zu lesen.

Ansonsten: hast du auch mehr Code, den du posten kannst? Vielleicht hat sich ja ein Fehler in Customer.contains() eingeschlichen, dann kann man in den paar Codezeilen lange nach einem Fehler suchen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Iterieren über eine Liste Java Basics - Anfänger-Themen 2
L Iterieren über ArrayList Java Basics - Anfänger-Themen 1
H in for Schleife über Vector iterieren Java Basics - Anfänger-Themen 2
G mit for each über Map iterieren :bahnhof: Java Basics - Anfänger-Themen 3
E Durch Muster in Array iterieren Java Basics - Anfänger-Themen 3
S Durch HashMap iterieren Java Basics - Anfänger-Themen 8
P Iterieren mit einer Foreach in Lambdaschreibweise und Counter. Java Basics - Anfänger-Themen 1
L Iterieren durch eine ArrayList. Integer Array wird übergeben Java Basics - Anfänger-Themen 17
S Mit einer LinkedList vorwärts und rückwärts iterieren Java Basics - Anfänger-Themen 6
T OOP Zwei Klassen Testen (Arrary Iterieren) Java Basics - Anfänger-Themen 6
feinperligekohlensaeure Arraylisten-Namen iterieren.. wie ? Java Basics - Anfänger-Themen 39
B OOP Über einen AVL-Baum iterieren (NullPointer) Java Basics - Anfänger-Themen 5
B OOP Über eine doppelt verkettete Liste iterieren Java Basics - Anfänger-Themen 4
N Durch Objekte iterieren? Java Basics - Anfänger-Themen 3
AssELAss Über ein Objekt vom Typ BigDecimal iterieren Java Basics - Anfänger-Themen 6
A Über Jahr iterieren, Freitag der 13. Java Basics - Anfänger-Themen 2
K Durch alle Attribute eines Objektes iterieren Java Basics - Anfänger-Themen 6
A Array iterieren Java Basics - Anfänger-Themen 20
K For Each Schleife wieder von Beginn an iterieren Java Basics - Anfänger-Themen 12
V Hashmap Iterieren Java Basics - Anfänger-Themen 4
G Erste Schritte Über verschiedene Datentypen iterieren. Gibt es sowas? Java Basics - Anfänger-Themen 19
P Variablen ArrayList mit Bedingung iterieren Java Basics - Anfänger-Themen 2
B Hashset iterieren problem Java Basics - Anfänger-Themen 3
K Datentypen Über Collection iterieren bringt fehler Java Basics - Anfänger-Themen 8
S OOP Durch ein Enum iterieren... Java Basics - Anfänger-Themen 47
P Über HashMap iterieren -> NullPointerException Java Basics - Anfänger-Themen 2
J Collection ArrayList und mit erweitertem for iterieren Java Basics - Anfänger-Themen 7
A Struts: Über Collection iterieren mir Taglibs? Java Basics - Anfänger-Themen 13
G Durch Liste iterieren und nachkommastellen runden Java Basics - Anfänger-Themen 9
D HashMap iterieren Java Basics - Anfänger-Themen 7
richis-fragen GlassPane über JScrollPane legen Java Basics - Anfänger-Themen 6
A Server - Client Nachrichtenaustausch über Eventbus Java Basics - Anfänger-Themen 12
P Neue Java v8 JRE Version nicht über alte drüber installierbar: Wie sonst? Java Basics - Anfänger-Themen 7
D Downloadfortschritt von Datei über Google Drive API v3 Java Basics - Anfänger-Themen 10
B großzügiges Pixelraster über Bildschirm legen Java Basics - Anfänger-Themen 7
ravenz Schleife mit for über String Array „zahlen“und prüfen ob Wert „a“ oder „b“ oder „c“ entspricht (mittels || ) Java Basics - Anfänger-Themen 4
L Beim Java Programmstart, mehrere Parameter über die Kommandozeile übergeben Java Basics - Anfänger-Themen 9
sserio Iterierung über ein zweidimensionales Array Java Basics - Anfänger-Themen 16
H Eine Methode über Actionlistener beenden Java Basics - Anfänger-Themen 8
S Java über SSH Java Basics - Anfänger-Themen 13
X Wie erreiche ich, dass ein Robot weitere Attribute hat, die nicht materialisiert sind, sondern nur über get/ set-Methoden simuliert sind? Java Basics - Anfänger-Themen 1
M Wie können Klassen nicht-materialisierte Attribute haben, die nur über get/ set-Mehoden simuliert sind? Java Basics - Anfänger-Themen 6
D Best Practice Ausgabe über direkte Ausgabe oder try-catch? Java Basics - Anfänger-Themen 13
R Eigenschaft über Parameter auslesen und ändern Java Basics - Anfänger-Themen 15
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
W Unterschiede bei Zugriff auf Objekt und Klassenvariablen über einen Getter? Java Basics - Anfänger-Themen 2
W char über die Konsole? Java Basics - Anfänger-Themen 7
EchtKeineAhnungManchmal Hallo :) ich bekomme es nicht hin eine Fehlermeldung auszugeben über die GUI Java Basics - Anfänger-Themen 3
S Array über ein Ausgabemethode in main ausgeben Java Basics - Anfänger-Themen 31
C Potenzberechnung über switch case. Taschenrechner mit Eingabe über einen grafischen Dialog Java Basics - Anfänger-Themen 22
J Wert zurückgeben über get Methode Java Basics - Anfänger-Themen 8
J Eintrag Combobox über einen String auswählen Java Basics - Anfänger-Themen 3
A Array Ansprache einer Zelle über Punktnotation? Java Basics - Anfänger-Themen 3
O Java über cmd benutzen ? Java Basics - Anfänger-Themen 5
J Variablenzugriff über string Java Basics - Anfänger-Themen 18
W Objekte über Scanner Input; ToString Probleme... Java Basics - Anfänger-Themen 4
H Methode über String Wert aufrufen Java Basics - Anfänger-Themen 8
M Java Kompilieren über Package grenzen hinaus Java Basics - Anfänger-Themen 4
M Arrays mit mehreren Werten über JOptionPane initialisieren Java Basics - Anfänger-Themen 12
Tino1993 Ellipse über draw Funktion ohne spur wandern lassen Java Basics - Anfänger-Themen 6
M Mehrere Datenbank zugriffe über tomee.xml regeln? Java Basics - Anfänger-Themen 1
N Input/Output Eine Frage über system.out.println. Java Basics - Anfänger-Themen 10
J Array über Getter erlangen Java Basics - Anfänger-Themen 34
S While-Schleife geht in Endlosschleife über, warum? Java Basics - Anfänger-Themen 6
B OOP-Anfänge über CMD + Editor Java Basics - Anfänger-Themen 30
G Variablen Array Länge über den Konstruktor definieren Java Basics - Anfänger-Themen 4
L Addition von Arrays über die Parameterliste Java Basics - Anfänger-Themen 11
C Datei über relative Pfade einlesen Java Basics - Anfänger-Themen 6
1 Erste Schritte Was denkt ihr über eines meiner ersten Javaprogramme? Java Basics - Anfänger-Themen 2
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
J Button über Pfeiltasten bewegen Java Basics - Anfänger-Themen 8
E Objekt durch Benutzer über Konsole erzeugen - Java Java Basics - Anfänger-Themen 3
N Eingabe Kommazahlen über Scanner Java Basics - Anfänger-Themen 2
T DoWhile Schleife über mehrere Mothoden Java Basics - Anfänger-Themen 5
C Collections List über Interface zugreifen Java Basics - Anfänger-Themen 32
J Gefilterten Stream über die Konsole ausgeben Java Basics - Anfänger-Themen 1
S Variablen Klassenvariable über Objekt aufrufen Java Basics - Anfänger-Themen 16
S Bilder über Socket Senden Java Basics - Anfänger-Themen 1
K Textdatei auslesen und über Mqtt schicken Java Basics - Anfänger-Themen 4
I GUI über Eclipse oder NetBeans Java Basics - Anfänger-Themen 23
S Klassenaufruf über JFrame Button Java Basics - Anfänger-Themen 3
Java The Hutt SetWerte über verschiedene Klassen Java Basics - Anfänger-Themen 16
L Zugriff auf Attribute eins Objekts über ActionListener Java Basics - Anfänger-Themen 4
O Methode über Leerzeichen Java Basics - Anfänger-Themen 13
I OOP Objektnamen über die Konsole richtig einlesen Java Basics - Anfänger-Themen 9
A Variablen Variablenwert über Konstruktor ändern Java Basics - Anfänger-Themen 3
J MySQL Datumsabfrage über ResultSet in Java-Servlet Java Basics - Anfänger-Themen 4
CptK Interface Bilder über Bildschirm bewegen, bis der Abstand zum vorherigen zu groß wird Java Basics - Anfänger-Themen 13
dapzoo Class File Version zu niedrig? Ausführen über Eingabeaufforderung nicht möglich Java Basics - Anfänger-Themen 14
J Punkt auf,über,unter oder zwischen 2 Geraden Java Basics - Anfänger-Themen 14
CptK Interface Bild über Methode ändern funktioniert nicht Java Basics - Anfänger-Themen 4
R Keine Verbindung zu MySql über Netbeans Java Basics - Anfänger-Themen 15
E Best Practice Jar-file mit zwei Klassen und externer Bibliothek über Konsole erzeugen Java Basics - Anfänger-Themen 13
J Aufruf einer Methode über einen String Java Basics - Anfänger-Themen 11
G Arraynamen über eine Schleife ansprechen Java Basics - Anfänger-Themen 4
S Bild über JButton legen Java Basics - Anfänger-Themen 3
temi Druckeransteuerung über ESC-Sequenz Java Basics - Anfänger-Themen 21
M Methodenaufruf über SQL UPDATE Java Basics - Anfänger-Themen 8
B Könnte jemand über dieses jurze Javaprogramm schauen? Irgendwas funktioniert mit der z-Varible nicht Java Basics - Anfänger-Themen 2
M Java Programm über Batch-Datei ausführen Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben