# Daten aus csv Datei auslesen und weiterverarbeiten



## teisho (11. September 2007)

Hallo,

nachdem ich bei meiner Suche nach Antworten des öffteren hier fündig geworden bin, dachte ich das es sich lohnen könnte selbst mal eine Frage zu stellen.

Ich bin gerade dabei ein Programm zu schreiben das mir einen Fahrplan erstellen soll.
Den Code dafür hab ich mir mehr schlecht als recht durch einen Haufen sehr lange if-Abfragen gebastelt. Sollte aber funktionieren.

Das Problem ist jetzt leider das erstens meine Programmierkenntnisse noch etwas beschränkt sind.
Ich muss um überhaupt richtig anfangen zu können Daten aus einer Excel Liste oder CSV Datei auslesen. Dies sind immer zwei Uhrzeiten, d.h. eine Ankunfts- und eine Abfahrtszeit.

In der CSV Datei werden meine beiden Spalten aus der Excel Liste ja auch in zwei "Spalten" dargestellt und da ich irgendwo gelesen habe das die CSV Datei zeilenweise ausgelesen wird dachte ich mir folgendes:

1.Ich lese die zusammengehörigen Daten z.B 16:12;17:15 als String aus, wenn das geht.

2.Ich zerlege den String dann mittels 

   String AS = Ankunftszeit.substring(0, 2);
   String AM = Ankunftszeit.substring(3;5);

und

   String AbS = Abflugszeit.substring(0, 2);
   String AbM = Abflugszeit.substring(3;5); 

in jeweil vier weitere Strings und wandle diese dann in Integer um und dann gehts los mit meinem eigentlichen Programm.
Ist sehr umständlich, was besseres is mir nicht eingefallen und da ich vor nicht ganz zwei Wochen auf "Hello World"-Basis angefangen habe war auch nichts schöneres oder eleganteres drin. (Bin aber offen für Anregungen)


So meine Frage ist nun, wie kann ich die Abfragen aus der CSV Datei auslesen?

Und wie kann ich am Ende meines Programms, d.h. wenn ich überprüft habe ob die Kombination aus Ankunfts- und Abfahrtszeit noch zulässig oder möglich ist, die Daten speicher und anschließend so ausgeben das ich sie verwerten kann?
(Sorry für die lange Komplizierte Frage) 

Ich bin für jede Hilfe und jeden Tipp dankbar!

Tschau


----------



## dto (11. September 2007)

Hier erst mal was zum auslesen.


```
public class readCSVTime {
    
    public readCSVTime() {
        try {
            java.io.BufferedReader FileReader=                      //ein Reader um die Datei Zeilenweise auszulesen
                    new java.io.BufferedReader(
                        new java.io.FileReader(
                            new java.io.File("csv.csv")
                        )
                    );
            
            String zeile="";
            
            while(null!=(zeile=FileReader.readLine())){         //lesen jeder Zeile  
                String[] split=zeile.split(";");                //hier wird die Zeile zerlegt als Trennzeichen ; 
                System.out.print(split[0]);                     //erste Zeit über index 0
                System.out.print(" --> ");
                
                    //wenn du noch trennen willst zwischen h und 
                    //min wendest du die split Funktion einfach nochmal an mit dem Trennzeichen : 
                    //Bsp. 
                    //System.out.println((split[0].split(":"))[0]);  //--> Stunde der ersten Zeit
                    //System.out.println((split[0].split(":"))[1]);  //--> min der ersten Zeit
                
                System.out.println(split[1]);                   //zweite Zeit über index 1
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        new readCSVTime();
    }
}
```
 
Zum verarbeiten würde ich sie natürlich in eine Datenstruktur einlesen.
z.B. Liste --> String[] n;        oder        java.util.Vector   oder oder oder

Beim wieder abspeichern gibt es auch viele möglichkeiten. Kannst es wieder als csv abspeichern. Oder als java Object (*java.io.Serializable*) oder oder oder

wenn du weitere Hilfe brauchst, frag


----------



## teisho (11. September 2007)

Wow, das ging ja echt schnell!

Vielen Dank erst mal, ich bin schon echt fast verzweifelt!

Ich hab Morgen den ganzen Tag Zeit und werde ein bisschen rumprobieren und je nachdem wie weit ich komme versuchen das Ganze mit meinen Code zu laufen zu bekommen.
Wenn du willst kann ich dann ja mal den Code, soweit er läuft, mit einer genaueren Erklärung meines Problems hochladen.
Vielleicht hast du ja ein paar Tipps wie man das eine oder andere schöner und eleganter lösen kann.

Aber nochmals vielen Dank und vielleicht bis morgen.

Tschau


----------



## teisho (12. September 2007)

Hallo,

ich bin leider heute keinen Schritt weitergekommen.

Ich habe versucht deinen Code so zu modifizieren das meine CSV,

1.so ausgelesen wird das ich in einer Zeile die Ankunfts- und Abfahrtszeit habe

2.die einzelnen Zeitpaare in einem Array zu speichern aus dem ich sie dann wieder    rausnehmen kann und durch meine Schleifen schicken kann.


Der erste Punkt hat schon einigermaßen funktioniert, ich hab erst die CSV Datei so verändert das ich erst nach einem Leerzeichen splitten konnte, d.h. hatte dann die Zeilen meiner CSV Datei. Dannach hab ich dann nochmal nach den ; gesplittet und hatte dann bei der Ausgabe eine Spalte mit allen Zeiten.

Der zweite Punkt hat aber überhaupt nicht geklappt, hab da an einigen Code-Stücken aus dem Internet rumgebastelt aber nie einen Array bekommen.
Wollte ja einen String-Array um die Zeiten auszuwählen und hätte diese dann in int umgewandelt...


----------



## Tobias Köhler (13. September 2007)

Stichwort Reguläre Ausdrücke.... könnte dir hier sehr helfen, sind zwar nicht ganz so leicht zu erlernen, aber es wird dir viel Zeit ersparen


----------



## dto (13. September 2007)

Zeig mir nochmal einen Ausschnitt aus der aktuellen csv Datei und beschreibe was du dann ganz genau haben willst.


----------



## teisho (14. September 2007)

Hallo,

meine csv Datei (eine der vielen Versionen die ich probiert habe) sieht so aus:

05:35;06:50
21:56;22:27
18:40;19:32
08:54;09:57
22:43;23:22
06:57;07:40...

also ganz normal die Excel Datei als csv abgespeichert.

Ich hab es nicht geschafft deinen Code zu modifizieren, meine Kenntnisse sind noch zu beschränkt dafür, doch habe ich glaub ich wenigstens verstanden was die einzelnen Zeilen bewirken.

In meiner Version deines Codes hab ich nur diese Zeile:         System.out.print(" --> ");

durch diese ersetzt:                                                             System.out.print(" ");

Ich habe mir gedacht das mir dann der spätere Zugriff leichter fällt.

Als Output erhalte ich:

05:35 06:50
21:56 22:27
18:40 19:32
08:54 09:57
22:43 23:22
06:57 07:40
12:31 13:46
06:00 07:13
06:27 06:57
19:37 20:47
19:55 21:15
18:20 18:59...
Das is schon ganz hervorragend, genau so wollte ich es auch haben, doch hab ich es nicht geschafft die einzelnen Zeilen in einen Array entsprechender Länge einzutragen.

Was ich also haben möchte wäre die einzelnen Zeilen, z.B 05:35 06:50, als Eintrag null in einem Array. (irgendwie so: Zeiten[0] = 05:35 06:50 usw.)

Wollte dies mit einem dynamischen Array machen der zuerst die Länge des Strings split[0] überprüft, dazu dann ein  Array anlegen usw. Konnte ich aber nicht.


Ich will dann im weiteren Verlauf nämlich zufällig ein Zeitpaar aus dem Array rausnehmen, auf Zulässigkeit prüfen und gegebenenfalls in einem Ausgabearray abspeichern...

wäre dir für deine Hilfe sehr dankbar


----------



## teisho (14. September 2007)

Hey,

habs geschafft
Kann dir den Code zeigen wenn du willst.

Werde aber noch mehr Fragen haben wenns weitergeht!


----------

