Iterieren über eine CSV Datei

Bitte aktiviere JavaScript!
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:
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"
 
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
 
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:
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....
 
  • Like
Reactions: Lia
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:
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.
 
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.
 
Passende Stellenanzeigen aus deiner Region:

Oben