# .csv Datei auswerten



## lennero (20. Jun 2017)

Hallo. Habe eine .csv Datei die so aufgebaut ist :
"Bundesland1" ; "Stadt1";plz1;plz2;plzn
"Bundesland1" ; "Stadt2" ; plz1;plz2;plzn
"Bundesland2" ;"Stadt1" usw usw usw

Jedes Bundesland hat also mehrere Städte mit Postleitzahlen. Die Postleitzahlen sind für die Aufgabe aber irrelevant.

Die Aufgabe besteht darin für jedes Bundesland die Städte in eine LinkedList zu speichern, anschließend ein Bundesland Objekt zu erstellen und dieses dann wieder in eine LinkedList zu Speichern. Leider kommt bei mir nichts richtiges heraus... Statt den 11 Bundesländern in der .csv erhalte ich nur 8 und die Städte sind immer gleich.

hier mal der code:


```
package prak;

import java.io.*;
import java.util.LinkedList;
import java.util.Scanner;

public class BundeslandApp {

    public static void main(String[] args) throws IOException {

        LinkedList<Bundesland> bund = new LinkedList<Bundesland>();
        LinkedList<String> stadt = new LinkedList<String>();



        BufferedReader br = new BufferedReader(new FileReader("C:/Users/TI/Desktop/postleitzahlen.csv"));
        String l = null;
        String l2 = null;
        String l4 = null;
        String l3[] = null;

        while((l=br.readLine())!=null){

            l2 = l.substring(0, l.indexOf(";", l.indexOf(";")+1));        // bundesländer und städte rausfiltern
            l4 = br.readLine();                                            //nächste Zeile




                if(l2.substring(1, l2.indexOf(";")-1).equals(l4.substring(1, l4.indexOf(";")-1))){        //wenn bundesland von nächster zeile = vorheriger zeile
                    stadt.add(l2.substring(l2.indexOf(";")+2,l2.length()-1));
                }
                if(!(l2.substring(1, l2.indexOf(";")-1).equals(l4.substring(1, l4.indexOf(";")-1)))){      //falls bundesländer nicht übereinstimmen
                    stadt.add(l2.substring(l2.indexOf(";")+2,l2.length()-1));                                //stadt der jetzigen zeile hinzufügen
                    Bundesland b = new Bundesland(l2.substring(1, l2.indexOf(";")-1),stadt);                // Bundesland erstellen
                    bund.add(b);                                                                            // in liste speichern
                    stadt.clear();                                                                        //stadtliste löschen
                  

            }




        }
        br.close();

        for(int i =0;i<bund.size();i++){
        System.out.println(bund.get(i).getName());
        System.out.println();
      
            for(int j =0;j<bund.get(i).getStadt().size();j++){
                System.out.println(bund.get(i).getStadt().get(j));
            }
            System.out.println("\n");
        }


    }

}
```


----------



## Meniskusschaden (20. Jun 2017)

Das scheinen ähnliche Fehler wie in diesem Thread zu sein.

In der Schleife liest du jeweils zwei Zeilen ein. Beim ersten Schleifendurchlauf verarbeitest du die erste und die zweite Zeile. Beim zweiten Durchlauf die dritte und vierte Zeile usw.. Du prüfst also beispielsweise nicht, ob die zweite und dritte Zeile zum selben Bundesland gehören. Es hat nur die erste, dritte, fünfte ... Zeile eine Chance, als Bundesland erstellt zu werden.

Du verwendest für alle Bundesländer dieselbe Städteliste. Folglich sind auch sämtlichen Bundesländern dieselben Städte zugeordnet.


----------



## lennero (21. Jun 2017)

Wie kann ich denn für jedes Bundesland, eine eigene Liste erstellen ? Meine while Schleife geht ja nur Zeilenweise, also wird für jede Zeile eine neue Liste erstellt, wenn ich diese innerhalb der Schleife instanziere. Deshalb wollte ich die Liste auch jedesmal löschen, nachdem ein Bundesland Objekt erstellt wurde. Anscheinend klappt das aber nicht...


----------



## Meniskusschaden (21. Jun 2017)

lennero hat gesagt.:


> also wird für jede Zeile eine neue Liste erstellt, wenn ich diese innerhalb der Schleife instanziere.


Du löschst die Liste doch auch innerhalb der Schleife und trotzdem geschieht es nicht für jede Zeile. Wo siehst du denn die Schwierigkeit, es beim Erstellen der Liste ähnlich zu machen?


----------



## lennero (21. Jun 2017)

Ich hab das Programm etwas umgeändert, Die Bundesländer werden korrekt erstellt, 16 Objekte werden in die Bundesland Liste gespeichert. Die Städte werden jedoch nicht gespeichert ... Ich hab unten die while schleife angehangen. Die stadtliste wurde mit null und blandvorher =" "; initialisiert. Ich hab das ganze auf papier aufgezeichnet und es sollte eigentlich so funktionieren ...


```
while((l=br.readLine())!=null){
          
          
            bunds = l.substring(0, l.indexOf(";", l.indexOf(";")+1));     
            bland = bunds.substring(1, bunds.indexOf(";")-1);
          
          
          
            if(!blandvorher.equals(bland)){
                if(blandvorher!=null){
                    bund.add(new Bundesland(bland,stadtliste));
                }
              
                stadtliste = new LinkedList<String>();
              
            }
          
            else
                stadtliste.add(stadt);
          
              
    
            blandvorher = bland;
            stadt = bunds.substring(bunds.indexOf(";")+2, bunds.length()-1);
          

          




        }
```


----------



## Meniskusschaden (21. Jun 2017)

lennero hat gesagt.:


> Die Städte werden jedoch nicht gespeichert


Werden gar keine gespeichert oder fehlen nur manche? Eigentlich sollte Letzteres zutreffen. Das hängt aber auch von der Struktur deiner Testdaten ab. Generell funktioniert dein Ansatz natürlich ohnehin nur, falls die Bundesländer in der Eingabedatei nicht vermischt sind, sondern immer blockweise in aufeinanderfolgenden Zeilen stehen.
Es gibt aber auch noch ein paar Fehler. Z.B. speicherst du die erste Stadt eines Bundeslandes grundsätzlich nicht. Ausserdem ordnest du die Städteliste dem falschen Bundesland zu. Du solltest das vielleicht mal mit dem Debugger durchspielen und besonders auf die Verarbeitung der jeweils ersten und letzten Zeile der Datei und des Bundeslandes achten.


----------



## lennero (21. Jun 2017)

Meniskusschaden hat gesagt.:


> Werden gar keine gespeichert oder fehlen nur manche? Eigentlich sollte Letzteres zutreffen. Das hängt aber auch von der Struktur deiner Testdaten ab. Generell funktioniert dein Ansatz natürlich ohnehin nur, falls die Bundesländer in der Eingabedatei nicht vermischt sind, sondern immer blockweise in aufeinanderfolgenden Zeilen stehen.
> Es gibt aber auch noch ein paar Fehler. Z.B. speicherst du die erste Stadt eines Bundeslandes grundsätzlich nicht. Ausserdem ordnest du die Städteliste dem falschen Bundesland zu. Du solltest das vielleicht mal mit dem Debugger durchspielen und besonders auf die Verarbeitung der jeweils ersten und letzten Zeile der Datei und des Bundeslandes achten.



Also die Bundesländer stehen alle untereinander, genauso strukturiert wie in meinem ersten Post.

Hiermit klappts dann.


```
while((l=br.readLine())!=null){
           
           
            bunds = l.substring(0, l.indexOf(";", l.indexOf(";")+1));      
            bland = bunds.substring(1, bunds.indexOf(";")-1);
            stadt = bunds.substring(bunds.indexOf(";")+2, bunds.length()-1);
           
           
            if(!blandvorher.equals(bland)){
                if(blandvorher!=null){
                    bund.add(new Bundesland(blandvorher,stadtliste));
                }
               
                stadtliste = new LinkedList<String>();
                stadtliste.add(stadt);
               
               
               
            }
           
            else
                stadtliste.add(stadt);
           
           
               
     
            blandvorher = bland;
           
           

           




        }
```


----------



## Meniskusschaden (21. Jun 2017)

Das sieht schon viel besser aus. Ich glaube trotzdem, dass noch zwei kleine Fehler enthalten sind. In diesem Code-Ausschnitt:

```
if(!blandvorher.equals(bland)){
                if(blandvorher!=null){
```
würde dein Programm bei der ersten Abfrage abstürzen, wenn `blandvorher==null` wäre, denn dann würde kein Objekt existieren, an dem `equals()` aufgerufen werden kann. Demzufolge kann es bei der zweiten Abfrage niemals null sein. Da das Programm offenbar nicht abstürzt, wirst du `blandvorher` irgendwo vor der Schleife initialisiert haben. Die zweite if-Abfrage wird ihren Zweck deshalb nicht erfüllen, so dass die Bundesland-Liste einen überflüssigen ersten Eintrag enthalten müsste.

Ähnlich verhält es sich mit dem letzten Bundesland. Da die Datei nach dem letzten Bundesland endet, wird für dieses Bundesand niemals der Fall `!blandvorher.equals(bland)` eintreten. Das Bundesland müsste in deiner Liste deshalb eigentlich fehlen.


----------



## BadBat (2. Jul 2017)

Solltest dir mal sowas anschauen
.stream().collect(Collectors.groupingBy());
Damit bekommste Key Values paare die du nurnoch auf deine LinkedList abbilden musst


----------

