Lesen eines files mit FILES.lines

n01sp

Mitglied
Hey ich hab mal wieder ien Problem:
Also ich habe eine csv datei gegeben normalerweise lese ich diese mit einem Stream ein und filter den Stream dann, aber jetzt soll ich das einlesen und filtern in einem stream machen.

Java:
    public void filetry() throws IOException {
        Path fi = Paths.get("C:/EWR_Ortsteile_Berlin_2015.csv");
        Path pi = Paths.get("C:/yellow_tripdata_2015-12.csv");
        Files.lines(fi);
       
       
        System.out.println(dataset.stream().mapToDouble(e -> e.hauefigkeit).sum());
       
       
    }
upload_2016-6-20_14-42-47.png

Die datei sieht so aus.
Jetzt kriege ich es nicht hin mit der Files Methode die gesamten einwohner aufzusummuieren, da ich ja nicht mehr die Häufigkeiten abrufen kann. Gibt es da einen guten weg nur die Spalte per Files einzulesen?
 
Ich kopiere mal was:

Input:
a,f,w,b,numinst,af,ub
1RW,800,64,22,1,48:2,true
1RW,800,16,39,1,48:2,true
1RW,800,640,330,1,48:2,true
1RW,800,40,124,1,48:2,true
1RW,800,32,104,1,48:2,true
1RW,800,8,104,1,48:2,true
1R1W,800,65536,39,1,96:96,true
1R1W,800,2048,39,1,96:96,true
1R1W,800,8192,39,1,48:48,true

Java:
public static void main(String[] args) throws Exception {
    File file = new File("test.csv");
    List<String> lines = Files.readAllLines(file.toPath(),
            StandardCharsets.UTF_8);
    for (String line : lines) {
        String[] array = line.split(",");
        System.out.println(array[0]);
    }
}
Output:

a
1RW
1RW
1RW
1RW
1RW
1RW
1R1W
1R1W
1R1W

Quelle: http://stackoverflow.com/questions/19931929/reading-a-column-from-csv-file-using-java
 
Das das so geht ist mir schon klar, aber mir geht es um die Perfomance, ich möchte nicht die ganze Datei einlesen sondern nur den Teil den ich möchte.

Files.lines(fi).forEach(z -> z.) , damit ich das ganze als Stream verwenden kann.
 
Das das so geht ist mir schon klar, aber mir geht es um die Perfomance, ich möchte nicht die ganze Datei einlesen sondern nur den Teil den ich möchte.

Du liest so oder so die gesamte Datei ein.
mit Files.lines "versteckst" du das lesen nur (ist auch deshalb imho die schönere Variante 😉 )

Files.lines(fi).forEach(z -> z.) , damit ich das ganze als Stream verwenden kann.

Wenn das einlesen klappt, was ist denn dann grad dein Problem?
Wie man daraus die Einwohner bekommt und diese aufsummiert?
Der Weg von @Cromewell war schon richtig, den String (=z) splitten, die passende Stelle im Array parsen, IntStream draus machen und summieren...
 
Wenn man will, bekommt man alles in eine Zeile. (Verkettete Aufrufe mit Streams bricht man übrigens Sinnvoll in mehrere Zeilen um 😉 )

Wenn du mit eine Zeile ein Statement meinst, ja, das geht. Warum sollte das nicht gehen?
 
Stream im Stream splitten? 😵

Du mappst den Stream<String> mit #split einfach auf Stream<String[]> und das dann mit index wieder auf Stream<String> (oder das ganze in einem)
 
Machst du wenn du #split benutzt sowieso^^
Java:
.map(line -> line.split(",")[7]).mapToInt(h -> Integer.parse(h)).sum()
 

Zurück
Oben