Methoden Erklärung wie ich eine spezielle Methode richtig anwende

Paul279

Aktives Mitglied
Hallo Leute,

Ich habe mir einen CSV Reader gebastelt mit der Bibliothek "JCSV"
Link zur Homepage
Es funktioniert tadellos, nur möchte ich das CSV Format umstellen auf "UK".
Laut Anleitung soll es ganz einfach sein, nur leider verstehe ich nicht, wie ich diesen Code anwenden muss.

Nun zu meinem funktionierenden Code:
Java:
       //CSV Schule importieren
        if (fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
            final File file = fc.getSelectedFile();
            Reader reader; 
            try {
                reader = new FileReader(file.getAbsolutePath());
                CSVReader<String[]> csvSchuleReader = CSVReaderBuilder.newDefaultReader(reader);
                try {

                    schule = csvSchuleReader.readAll();

                } catch (IOException ex) {
                    Logger.getLogger(server.class.getName()).log(Level.SEVERE, null, ex);
                    this.jTextArea_meisterschaftStarten_Error.setText(this.jTextArea_meisterschaftStarten_Error.getText().toString()+"Beim Lesen der CSV Schule ist ein Fehler aufgetreten!\n");
                    this.jLabel_versteckt_CSV_Ueberpruefung.setText("0");
                }
            } catch (FileNotFoundException ex) {
                Logger.getLogger(server.class.getName()).log(Level.SEVERE, null, ex);
                this.jTextArea_meisterschaftStarten_Error.setText(this.jTextArea_meisterschaftStarten_Error.getText().toString()+"Beim Lesen der CSV Schule ist ein Fehler aufgetreten!\n");
                this.jLabel_versteckt_CSV_Ueberpruefung.setText("0");
            }
        
        }

Ich lade aber immer CSV mit dem EXCEL Format hinein. (Funktioniert)

Es gibt zwar auf der Homepage eine Erklärung dass ich dem CSVReader einfach das:

new CSVReader.Builder<MyClass>.(csvFileReader).strategy(myStrategy)...;

hinzufügen muss, leider verstehe ich nicht wie.
Link zur Erklärung

Kann mir bitte jemand sagen wie ich es schreiben muss, damit der CSVReader UK CSV einlesen kann.

Danke schon mal
 
Ungetestet, sollte etwa so sein
Java:
reader = new FileReader(file.getAbsolutePath());
//CSVReader<String[]> csvSchuleReader = CSVReaderBuilder.newDefaultReader(reader);

CSVReader<String[]> csvSchuleReader = 
    new CSVReaderBuilder<String[]>(reader).strategy(CSVStrategy.UK_DEFAULT ).build();

EDIT: Kleine Änderung, scheint Laut APIDoc anders als auf der verlinkten Seite zu sein... ???:L
 
Danke für deine Hilfe.

Also er schlägt mir vor das ganze auf CSVReaderBuilder zu casten oder den Datentyp auf CSVReaderBuilder zu ändern.

Beides funktioniert nicht, da er dann bei der Zeile
Java:
csvSchuleReader.readAll()
; einen Fehler schmeist.

Wenn man castet und das Programm läuft sagt er dass er es nicht casten kann.

Wenn man den Datentyp ändert sagt er dass "Uncompilable source code"
 
Zuletzt bearbeitet:
EDIT: Kleine Änderung, scheint Laut APIDoc anders als auf der verlinkten Seite zu sein...
Ist korrigiert, das war noch ne ältere Version der API.

@TO:
Es sollte reichen wenn du folgende Zeile änderst.
Java:
CSVReader<String[]> csvSchuleReader = CSVReaderBuilder.newDefaultReader(reader);
=>
Java:
CSVReader<String[]> csvSchuleReader = new CSVReaderBuilder<String[]>(reader).strategy(CSVStrategy.UK_DEFAULT).build()
Mehr sollte nicht notwendig sein.
 
Er meldet mir den Fehler:
"you have to specify a csv entry parser"

Ich möchte aber keinen Entry parser verwenden.
Ich habe diese Codezeilen(den entry parser versteh ich leider nicht):

Java:
       // Schule einlesen
       int listengroese = schule.size();
       for(int i=0; i<listengroese; i++)
       {
          String[] temp = schule.get(i);    //Aus der Liste Schule ein String Array heraus holen und auslesen
          sid = Integer.valueOf(temp[0]);
          land = temp[14];
          schulname = temp[3];
            try {
                statement.executeUpdate("INSERT INTO ASDU.SCHULE (SID, LAND, SCHULNAME) VALUES ("+sid+", '"+land+"', '"+schulname+"')");
            } catch (SQLException ex) {
                String test3 = "INSERT INTO ASDU.SCHULE (SID, LAND, SCHULNAME) VALUES ("+sid+", '"+land+"', '"+schulname+"')";
                System.out.println("FEHLER2");
                rueckgabe += "Bei der Zeile "+(i+1)+" ist ein Fehler aufgetreten(Schule)! NICHTs wurde importiert \n";
                break;
            }
       }

Es muss doch auch ohne auch gehen. Ich verwende doch sonst auch keinen und es funktioniert ?
 
Ja das ist in der Tat etwas ungünstig.
Standardmäßig wird ein EntryParser verwendet der aus einem Datensatz ein String[] Array macht, der wird auch beim Aufruf von newDefaultReader verwendet.
Wenn du dir einen eigenen CSVReader bauen willst musst du (aktuell) diesen EntryParser noch übergeben, weil sonst eben der CSVReader nicht weiß wie er einen Datensatz verarbeiten soll.

Folgendes funktioniert:
Java:
new CSVReaderBuilder<String[]>(reader).strategy(CSVStrategy.UK_DEFAULT).entryParser(new DefaultCSVEntryParser()).build();

Das werd ich vielleicht mal anpassen, weil besonders schön ist das ja nicht... :rtfm:

EDIT:
Nein, geändert werden kann das doch nicht.
Man kann ja mit dem CSVReaderBuilder einen beliebigen CSVReader bauen, der DefaultCSVEntryParser kann aber nur String[] Arrays erstellen, um die Angabe kommt man also nicht drum rum.
 
Zuletzt bearbeitet von einem Moderator:
Ich habe die Zeile ausprobiert und es funktioniert! Super danke sehr.

Aber was meinst du mit deinem Edit?

Also was meinst du mit:
Nein, geändert werden kann das doch nicht.
Was kann nicht geändert werden?
Meinst du die Codezeile? Die funktioniert ja tadellos?



Und das der DefaultReader nur Strings macht ist mir klar, das macht aber nichts.

//EDIT
woher habt ihr überhaupt diese Information? Habe selbst google durchforstet aber z.B. mit dem
.build() habe ich schon mal nirgends gelesen.

Okay API, sollte schlafen gehen danke
 
Zuletzt bearbeitet:
Mit dem EDIT meinte ich die Änderung in der API, dass der DefaultCSVEntryParser als Standard verwendet wird, das geht beim erstellen eines individuellen Parsers aber nicht.
Ist für dein Problem aber nicht relevant, bei dir gehts ja jetzt 😉
 

Neue Themen


Zurück
Oben