# CSV in Java einbinden und Rechnung



## blueman189 (25. Sep 2018)

Hallo,
habe eine Frage und zwar soll ich mit der Tabelle( siehe Anhang) eine csv erstellen welche in java ausgelesen werden soll. Dabei interessieren hier die Gesamterträge pro Sorte und die Erträge pro Sorte in den ersten 10 Jahren jeweils in den Angaben pro Baum (avg werte). Jetzt meine Frage wie ich das in java am klügsten programmieren kann. Ich würde die csv mit einem buffered reader auslesen, weiß leider nicht wie ich dies am besten machen kann um die verechnungen gut hinzubekommen. Die Daten in der Tabelle sind 2 apfelsorten und die anzahl meint die bäume.

code:
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;

public class Apple{

    private List<String> AppleData;

    public static void main(String[] args) {

        try {
            List<String> AppleData = Files.readAllLines(Paths.get("D:\\Apples\\apple.csv"));
        for(String line : AppleData) {
            System.out.println(line);
            String[] vals = line.split(",");
        }
        }catch (Exception e) {
            System.out.println(e.getMessage()); 
        }
    }
}


----------



## Dimax (25. Sep 2018)

In deinem string [] vals sind alle daten schon  gespeichert .Also

```
int gesamtErtragBrauburn=0;
int gesamtErtragVonLady=0;
for(int i=0;i<vals.length;i++){
if(vals[i].equals("Brauburn"){
gesamtErtragBrauburn=gesamtErtragBrauburn+Integer.valueOf(vals[i+3]);
}
else if(vals[i].equals("Pink Lady"){......... usw
```
so ungefähr,sonst testen


----------



## Robat (25. Sep 2018)

Ich würde wohl eher eine eigene Klasse dafür erstellen.

```
public class Variety {
    private String name;
    private int amount;
    private int age;
    private int totalAmount;

    public Variety(String name, int amount, int age, int totalAmount) {
        this.name = name;
        this.amount = amount;
        this.age = age;
        this.totalAmount = totalAmount;
    }

    ....
}
```
Dann hast du am Ende eine `List<Variety>` und kannst dir zB. mit der Java8 Stream-API relativ einfach den Gesamtertrag pro Sorte errechnen lassen

```
long totalBraunburn = varieties.stream().filter(variety -> variety.getName().equals("Braunburn")).mapToInt(Variety::getTotalAmount).sum();
```
Ggf könnte man für den Namen (was ja der Typ ist) auch ein eigenes Enum erstellen um nicht alle möglichen String-Werte zuzulassen.


----------



## mihe7 (25. Sep 2018)

```
import java.util.*;
import java.nio.file.*;
import java.util.stream.*;

public class Test {
    public static class Apple {
        public final String species;
        public final int count;
        public final int age;
        public final int yield;

        public Apple(String species, int count, int age, int yield) {
            this.species = species;
            this.count = count;
            this.age = age;
            this.yield = yield;
        }

        public static Apple of(String[] data) {
            String species = data[0];
            int count = Integer.parseInt(data[1]);
            int age = Integer.parseInt(data[2]);
            int yield = Integer.parseInt(data[3]);
            return new Apple(species, count, age, yield);
        }
    }

    public static Apple aggregate(Apple a, Apple b) {
        return new Apple(b.species, a.count + b.count, 0, a.yield + b.yield);
    }

    public static void main(String[] args) throws Exception {
        List<Apple> apples = Files.lines(Paths.get("./data.csv"))
            .skip(1)
            .map(line -> Apple.of(line.split(",")))
            .collect(Collectors.toList());

        Apple zero = new Apple("", 0, 0, 0);

        Map<String,Apple> sumsAll = apples.stream()
            .collect(Collectors.groupingBy(apple -> apple.species,
                    Collectors.reducing(zero, Test::aggregate)));
        Map<String,Apple> sumsLast10Years = apples.stream()
            .filter(a -> a.age < 10)
            .collect(Collectors.groupingBy(apple -> apple.species,
                    Collectors.reducing(zero, Test::aggregate)));

        System.out.printf("Sorte,Anzahl,Ertrag,Ertrag/Baum,Zeitraum\n");
        sumsAll.values().forEach(a -> {
            System.out.printf(Locale.US,
                "%s,%d,%d,%.2f,komplett\n", a.species, a.count, a.yield,
                (float)a.yield/a.count);
        });
        sumsLast10Years.values().forEach(a -> {
            System.out.printf(Locale.US,
                "%s,%d,%d,%.2f,10 Jahre\n", a.species, a.count, a.yield,
                (float)a.yield/a.count);
        });
    }
}
```


----------



## blueman189 (25. Sep 2018)

Hab das jetzt wie würd ich jetzt weitermachen für obige aufgabe. 


import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class Apple{

    private File file;
    private List<String> AppleData;


    public Apple(String filename) {
        file = new File(filename);
        AppleData = new ArrayList<String>();
    }
    public void parse() {
        try { BufferedReader reader = new BufferedReader(new FileReader(file));
            String line = ""; 
            while ((line = reader.readLine()) != null) {
                String [] apfelBaum = line.split(";");
                AppleData.add(line);}
        }catch (FileNotFoundException e) {
            e.printStackTrace();
    }catch (IOException e) {
        e.printStackTrace();
    }
    }

    public List<String> getAppleData(){
        return AppleData;
    }
}


----------



## mihe7 (25. Sep 2018)

Kannst Du Deinen Code bitte in [code=Java]...[/code] setzen?


```
String [] apfelBaum = line.split(";");
AppleData.add(line);
```
Wieso splittest Du die Zeile, wenn Du sie dann ungesplittet zur Liste hinzufügst?


----------



## blueman189 (25. Sep 2018)

So habe jetzt den komplette Code geschrieben. Jedoch bekomm ich eine Ausgabe die ich nicht haben möchte.
Was habe ich falsch gemacht?
Ausgabe in Eclipse:      
Code:

```
public class TestExcel
        {
            public double gesamtertragSorte1 = 0;
            public double gesamtertragSorte2 =0;
            public double durchschnittSorte1 =0;
            public double durchschnittSorte2 =0;
            private ArrayList<ApfelsorteZelle> saft = new ArrayList<ApfelsorteZelle>();
          
            public TestExcel()
            {
                try
                {
                    BufferedReader FileReader = new BufferedReader(new FileReader("D:\\Testat\\testat.csv"));
                  
                    String zeile = "";
                    String[] ersteZeile = FileReader.readLine().split(",");
                  
                    boolean richtigerSyntax = prüfeRichtigerDateiensyntax(ersteZeile);
                    while(null != (zeile = FileReader.readLine()) && richtigerSyntax)
                    {
                        String[] aktuelleZeile = zeile.split(",");
                        if(!sucheZelleMitSorte(aktuelleZeile))
                        {
                        fügeNeueSorteHinzu(aktuelleZeile);
                        }
                    }
                  
                    int counter = 0;
                    while(saft.size() > counter)
                    {
                        saft.get(counter).berechneDurchschnittsertragInDenErsten10JahrenProBaumProSorte();
                        saft.get(counter).berechneDurchschnittsgesamtertragProBaumProSorte();
                        if(counter == 0)
                        {  
                            gesamtertragSorte1=saft.get(counter).getGesamtertrag();
                            durchschnittSorte1 = saft.get(counter).getErtragInDenErsten10Jahren();
                            durchschnittSorte1 = Math.round(100.0*durchschnittSorte1)/100.0;
                            gesamtertragSorte1=Math.round(100.0*gesamtertragSorte1)/100.0;
                            //System.out.println(saft.get(counter).getGesamtertrag());
                        }
                        else if(counter == 1)
                        {
                            //System.out.println(saft.get(counter).getGesamtertrag());
                            gesamtertragSorte2=saft.get(counter).getGesamtertrag();
                            durchschnittSorte2 =saft.get(counter).getErtragInDenErsten10Jahren();
                            durchschnittSorte2 = Math.round(100.0*durchschnittSorte2)/100.0;
                            gesamtertragSorte2=Math.round(100.0*gesamtertragSorte2)/100.0;
                        }
                        else
                        {
                            System.out.println("unerwartet");
                        }
                        //System.out.println(saft.get(counter).getGesamtertrag());
                        counter++;
                    }
                }
                catch (FileNotFoundException e)
                {
                    e.printStackTrace();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
      
                String html="<div><h1> Programmierung 3 </h1><p>Testat 3:</p1>"
                        + "<table border = 1>"
                        + "<tr>"
                        + "<th>Sorte</th>"
                        + "<th>Gesamtertrag</th> "
                        + "<th> Erträge_in_10_Jahren</th> "
                        + "</tr> "
                        + "<tr> "
                        + "<td>Braeburn </td><td>";
          
                String html2="</td>"
                        + "<td>";
          
                String html3="</td></tr><tr>"
                        + " <td>Pink Lady </td> <td>";
                String html4 = "</td><td>";
                String html5 = "</td> </tr> </table> </div>";
                  
                File f = new File ("D:\\Testat\\webanwendung.html");
              
                try
                {
                    BufferedWriter bw = new BufferedWriter (new FileWriter (f));
                    bw.write(html);
                    bw.write (Double.toString(gesamtertragSorte1));
                    bw.write(html2);
                    bw.write(Double.toString(durchschnittSorte1));
                    bw.write(html3);
                    bw.write(Double.toString(gesamtertragSorte2));
                    bw.write(html4);
                    bw.write(Double.toString(durchschnittSorte2));
                    bw.write(html5);
                    bw.close ();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
              
                System.out.println(gesamtertragSorte1);
                System.out.println(gesamtertragSorte2);
                System.out.println(durchschnittSorte1);
                System.out.println(durchschnittSorte2);
              
            }
            private void fügeNeueSorteHinzu(String[] aktuelleZeile)
            {
                ApfelsorteZelle neueApfelsorte = new ApfelsorteZelle(aktuelleZeile[0], Integer.parseInt(aktuelleZeile[1]),
                        Integer.parseInt(aktuelleZeile[2]), Integer.parseInt(aktuelleZeile[3]));
                saft.add(neueApfelsorte);      
            }
          
            private boolean prüfeRichtigerDateiensyntax(String[] ersteZeile)
            {
                if(!ersteZeile[0].equals("Sorte") || !ersteZeile[1].equals("Anzahl") || !ersteZeile[2].equals("Alter")
                    || !ersteZeile[3].equals("Gesamtertrag")) {
                    System.out.println("Diese Datei hat falschen Syntax.");
                    return false;
                }
                return true;
              
            }
          
            private boolean sucheZelleMitSorte(String[] aktuelleZeile)
            {
                boolean bereitsVerarbeitet = false;
                int n_teZelle = 0;
                while(!bereitsVerarbeitet && !saft.isEmpty() && saft.size() > n_teZelle)
                {
                    if(saft.get(n_teZelle).getName().equals(aktuelleZeile[0]))
                    {
                        fügeDieseZeileHinzu(saft.get(n_teZelle), aktuelleZeile);
                        bereitsVerarbeitet = true;
                        return true;
                    }
                    n_teZelle++;
                }
                return false;
            }

            private void fügeDieseZeileHinzu(ApfelsorteZelle apfelsorteZelle, String[] aktuelleZeile)
            {
                apfelsorteZelle.fügeZuGesamtertragHinzu(
                        Integer.parseInt(aktuelleZeile[3]), Integer.parseInt(aktuelleZeile[1]));
              
                apfelsorteZelle.fügeZuErtragInDenErsten10JahrenHinzu(
                        Integer.parseInt(aktuelleZeile[3]), Integer.parseInt(aktuelleZeile[1]),
                        Integer.parseInt(aktuelleZeile[2]));
            }

            public class ApfelsorteZelle
            {
              
                int anzahlTeiler = 0;      
                private String name;
                private double gesamtertrag = 0;
                private double ertragInDenErsten10Jahren;
              
                public ApfelsorteZelle(String name, int anzahlBäume, int alter, double gesamtertrag)
                {
                    this.name = name;
                    fügeZuGesamtertragHinzu(gesamtertrag, anzahlBäume);
                    fügeZuErtragInDenErsten10JahrenHinzu(gesamtertrag, anzahlBäume, alter);
                }
              
                public String getName()
                {
                    return name;
                }
              
                public double getGesamtertrag()
                {
                    return gesamtertrag;
                }
              
                public double getErtragInDenErsten10Jahren()
                {
                    return ertragInDenErsten10Jahren;
                }
              
                public void fügeZuGesamtertragHinzu(double zahl, int anzahlBäume)
                {
                    gesamtertrag = gesamtertrag + zahl / anzahlBäume;
                    anzahlTeiler++;
                }
              
                public void fügeZuErtragInDenErsten10JahrenHinzu(double zahl, int anzahlBäume, int alter)
                {
                    if(alter < 10) {
                        ertragInDenErsten10Jahren = ertragInDenErsten10Jahren + zahl / anzahlBäume;
                    } else {
                        ertragInDenErsten10Jahren = ertragInDenErsten10Jahren + zahl / anzahlBäume / alter * 10;
                    }
                }
              
                public void berechneDurchschnittsgesamtertragProBaumProSorte()
                {
                    gesamtertrag = gesamtertrag / anzahlTeiler;
                }
              
                public void berechneDurchschnittsertragInDenErsten10JahrenProBaumProSorte()
                {
                    ertragInDenErsten10Jahren = ertragInDenErsten10Jahren / anzahlTeiler;
                }
            }  
        }
```


----------



## blueman189 (26. Sep 2018)

Hab meinen Fehler gefunden. Trotzdem danke für eure Hilfe, konnte ein paar von euch gebrauchen.


----------

