# CSV File lesen, in ArrayList speichern und ausgeben



## leMoi66 (12. Sep 2017)

Hallo zusammen,

ich versuche gerade ein Algorithmus zu schreiben, mit dem ich eine CSV Datei einlesen kann, die Daten in eine ArrayList speichern und dann je nach dem, entweder auf der Konsole auszugeben, oder halt weiter in Richtung DB zu geben. 

Momentan versuche ich die eingelesenen Werte erst einmal auf der Konsole auszugeben, erhalte allerdings folgende Fehlermeldung. Ich habe bereits versucht zu debuggen: der Fehler liegt  in der Klasse "CSVReader" , hier bei der Anweisung "String line = br.readLine();

*Fehlermeldung:*

```
C:\Apps\Java\jdk1.8\bin\java...
java.nio.charset.MalformedInputException: Input length = 1
    at java.nio.charset.CoderResult.throwException(CoderResult.java:281)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
    at java.io.InputStreamReader.read(InputStreamReader.java:184)
    at java.io.BufferedReader.fill(BufferedReader.java:161)
    at java.io.BufferedReader.readLine(BufferedReader.java:324)
    at java.io.BufferedReader.readLine(BufferedReader.java:389)
    at com.mhp.biReportingTool.server.data.mapper.CsvReader.readExportDataFromCSV(CsvReader.java:68)
    at Main.main(Main.java:65)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

Process finished with exit code 0
```

Habt ihr  eine Idee, wieso das Programm hier abbricht? Ich komme leider nicht mehr weiter...
Im folgenden meine Code (alle benötigten Klassen / Bibliotheken sind importiert, nur nicht im Code zu finden). 

Vielen Dank schon einmal im Voraus!! 

*Main-Klasse*

```
public class MainClass {

    public static void main(String[] args) {
   
    //BW-Export.CSV File soll nun ausgelesen und in der Konsole ausgegeben werden
   
     CsvReader csvReader = new CsvReader();

        ArrayList<BW_ExportBO> bw_exportTest = csvReader.readExportDataFromCSV("C:\\Users\\root\\Documents\\TestFiles\\bwexp.csv");

        for (java.util.Iterator<BW_ExportBO> iterator = bw_exportTest.iterator(); iterator.hasNext(); ) {
            BW_ExportBO b = iterator.next();

            System.out.print("Projekt-ID: " + b.getProjekt_id() + " | ");
            System.out.print("Projekt-Name: " + b.getProjekt_bezeichnung() + " | ");
            System.out.print("Jobnummer: " + b.getJobnummer() + " | ");
            System.out.print("Jobname: " + b.getJobname() + " | ");
            System.out.print("Mitarbeiter-ID: " + b.getMitarbeiter_id() + " | ");
            System.out.print("Mitarbeiter-Name: " + b.getMitarbeiter_name() + " | ");
            System.out.print("Externer Berater: " + b.getExt_berater() + " | ");
            System.out.print("Datum: " + b.getDatum() + " | ");
            System.out.print("Startzeit: " + b.getStartzeit() + " | ");
            System.out.print("Ende: " + b.getEndezeit() + " | ");
            System.out.print("TB Beschreibung 1: " + b.getTb_beschreibung1() + " | ");
            System.out.print("TB Beschreibung 2: " + b.getTb_beschreibung2() + " | ");
            System.out.print("Aufwand: " + b.getAufwand() + " | ");
            System.out.println("Pause: " + b.getPause() + " | ");
        }

    }
}
```

*CSV-Reader-Klasse*

```
public class CsvReader {

    public static ArrayList<BW_ExportBO> readExportDataFromCSV(String filePath) {
        ArrayList<BW_ExportBO> bw_exports = new ArrayList<>();
        Path pathToFile = Paths.get(filePath);

        //Erstellt Objekt von BufferedReader
        try (BufferedReader br = Files.newBufferedReader(pathToFile, StandardCharsets.UTF_8)) {

            //erstellt Objekt von LineNumberReader (zum Auslesen der aktuellen Zeile)
            LineNumberReader lineNumberReader = new LineNumberReader(Files.newBufferedReader(pathToFile));

            //gibt aktuelle Zeilennummer zurück
            int currentLineNumber = lineNumberReader.getLineNumber();

            //gibt an, ab welcher Zeile die relevanten Daten in der CSV-File stehen
            int startLine = 6;
            //liest Zeile des CSV Files
            String line = br.readLine();


            //die zwei nachfolgenden Schleifen bewirken, dass alle Zeilen ab Zeile 6 ausgelesen werden
            while (currentLineNumber < startLine) {
                currentLineNumber++;
            }

           // while (currentLineNumber >= startLine && line != null) {
            while (line != null) {

                //lädt die ausgelesenen Werte einer Zeile in ein Array und separiert diese mittels eines Semikolon
                String[] valueOfLine = line.split(";");

                BW_ExportBO bw_export = createBwExport(valueOfLine);

                //aktuelle Zeile aus dem BW-Export wird in die BW-Export-Liste eingetragen
                bw_exports.add(bw_export);

                //nächste Zeiele lesen, bevor die Schleife wieder von vorne beginnt
                //falls Ende des CSV-Files erreicht wird, wird die Variable "line" auf NULL gesetzt
                line = br.readLine();

            }
        } catch (IOException ioe){
            ioe.printStackTrace();
        }
        return bw_exports;
        }
    }
   
    private static BW_ExportBO createBwExport(String[] metadata) { //metadata indiziert die Spaltennamen zwecks ihrer Wertzuweisungen
        int bwexport_id; //ID sollte fortlaufend sein TODO: Herausfinden, wie dies automatisch gestaltet werden kann -> womögl. erst beim Mapping zur DB??
        int projekt_id = Integer.parseInt(metadata[0]);
        String projekt_bezeichnung = metadata[1];
        int jobnummer = Integer.parseInt(metadata[2]);
        String jobname = metadata [3];
        int mitarbeiter_id = Integer.parseInt(metadata[4]);
        String mitarbeiter_name = metadata[5];
        String ext_berater = metadata[6];
        String datum = metadata[7];
        String startzeit = metadata[8];
        String endezeit = metadata[9];
        String tb_beschreibung1 = metadata[10]; //im Falle mehrere Nummern, nur erste beachten.
        String tb_beschreibung2 = metadata[11];

        String str1 = metadata[12].replace(",", "."); //ersetzt das Komma durch einen Punkt, da Fließkomma-Datentyp double einen Punkt als Separator kennt
        double aufwand = Double.parseDouble(str1);

        String str2 = metadata[13].replace(",", "."); //ersetzt das Komma durch einen Punkt, da Fließkomma-Datentyp double einen Punkt als Separator kennt
        double pause = Double.parseDouble(str2);

        //erstellt und gibt BW-Export-Objekt mit diesen Metadaten zurück
        return new BW_ExportBO
                (projekt_id, projekt_bezeichnung, jobnummer, jobname, mitarbeiter_id,
                        mitarbeiter_name, ext_berater, datum, startzeit, endezeit, tb_beschreibung1,
                        tb_beschreibung2, aufwand, pause
                );

    }

}
```

*BW_ExportBO - Business Objects (Java Klasse mit Getter und Setter)
*

```
public class BW_ExportBO {

    private int bwexport_id;
    private int projekt_id;
    private String projekt_bezeichnung;
    private int jobnummer;
    private String jobname;
    private int mitarbeiter_id;
    private String mitarbeiter_name;
    private String ext_berater;
    private String datum;
    private String startzeit;
    private String endezeit;
    private String tb_beschreibung1;
    private String tb_beschreibung2;
    private double aufwand;
    private double pause;

    public BW_ExportBO(int projekt_id, String projekt_bezeichnung, int jobnummer, String jobname,
                       int mitarbeiter_id, String mitarbeiter_name, String ext_berater,
                       String datum, String startzeit, String endezeit, String tb_beschreibung1,
                       String tb_beschreibung2, double aufwand, double pause) {
                      
        this.projekt_id = projekt_id;
        this.projekt_bezeichnung = projekt_bezeichnung;
        this.jobnummer = jobnummer;
        this.jobname = jobname;
        this.mitarbeiter_id = mitarbeiter_id;
        this.mitarbeiter_name = mitarbeiter_name;
        this.ext_berater = ext_berater;
        this.datum = datum;
        this.startzeit = startzeit;
        this.endezeit = endezeit;
        this.tb_beschreibung1 = tb_beschreibung1;
        this.tb_beschreibung2 = tb_beschreibung2;
        this.aufwand = aufwand;
        this.pause = pause;
    }

    public int getBwexport_id() {
        return bwexport_id;
    }

    public void setBwexport_id(int bwexport_id) {
        this.bwexport_id = bwexport_id;
    }

    public int getProjekt_id() {
        return projekt_id;
    }

    public void setProjekt_id(int projekt_id) {
        this.projekt_id = projekt_id;
    }

    public String getProjekt_bezeichnung() {
        return projekt_bezeichnung;
    }

    public void setProjekt_bezeichnung(String projekt_bezeichnung) {
        this.projekt_bezeichnung = projekt_bezeichnung;
    }

    public int getJobnummer() {
        return jobnummer;
    }

    public void setJobnummer(int jobnummer) {
        this.jobnummer = jobnummer;
    }

    public String getJobname() {
        return jobname;
    }

    public void setJobname(String jobname) {
        this.jobname = jobname;
    }

    public int getMitarbeiter_id() {
        return mitarbeiter_id;
    }

    public void setMitarbeiter_id(int mitarbeiter_id) {
        this.mitarbeiter_id = mitarbeiter_id;
    }

    public String getMitarbeiter_name() {
        return mitarbeiter_name;
    }

    public void setMitarbeiter_name(String mitarbeiter_name) {
        this.mitarbeiter_name = mitarbeiter_name;
    }

    public String getExt_berater() {
        return ext_berater;
    }

    public void setExt_berater(String ext_berater) {
        this.ext_berater = ext_berater;
    }

    public String getDatum() {
        return datum;
    }

    public void setDatum(String datum) {
        this.datum = datum;
    }

    public String getStartzeit() {
        return startzeit;
    }

    public void setStartzeit(String startzeit) {
        this.startzeit = startzeit;
    }

    public String getEndezeit() {
        return endezeit;
    }

    public void setEndezeit(String endezeit) {
        this.endezeit = endezeit;
    }

    public String getTb_beschreibung1() {
        return tb_beschreibung1;
    }

    public void setTb_beschreibung1(String tb_beschreibung1) {
        this.tb_beschreibung1 = tb_beschreibung1;
    }

    public String getTb_beschreibung2() {
        return tb_beschreibung2;
    }

    public void setTb_beschreibung2(String tb_beschreibung2) {
        this.tb_beschreibung2 = tb_beschreibung2;
    }

    public double getAufwand() {
        return aufwand;
    }

    public void setAufwand(double aufwand) {
        this.aufwand = aufwand;
    }

    public double getPause() {
        return pause;
    }

    public void setPause(double pause) {
        this.pause = pause;
    }
}
```


----------



## Harry Kane (15. Sep 2017)

Was ist denn Zeile 68 in CsvReader.java? Es wäre für die Fehleranalyse wichtig dass zu wissen.


----------



## Wurstkopp (15. Sep 2017)

Wo kommt deine CSV Datei her? Wie stellst du das Encoding von UTF-8 sicher? UTF-8 mit oder ohne BOM?


----------



## leMoi66 (22. Sep 2017)

Aus irgendeinem Grund ging das einlesen mit UTF-8 nicht. Mit dem ISO 8859 1 Format hat es geklappt 
Vielen Dank für eure Unterstützung!


----------

