Parsing einer CSV-Datei für eine eindeutige Zeile mit der neuen Java 8 Streams-API

Ich versuche, die neue Java 8 Streams-API (für die ich ein absoluter Neuling bin) zu verwenden, um eine bestimmte Zeile (die mit 'Neda' in der Namensspalte) in einer CSV-Datei zu analysieren. Mit dem folgendenArtike Aus Gründen der Motivation habe ich einige Fehler modifiziert und behoben, sodass ich die Datei mit den drei Spalten "Name", "Alter" und "Größe" analysieren konnte.

name,age,height
Marianne,12,61
Julie,13,73
Neda,14,66
Julia,15,62
Maryam,18,70

Der Parsing-Code lautet wie folgt:

@Override
public void init() throws Exception {
    Map<String, String> params = getParameters().getNamed();
    if (params.containsKey("csvfile")) {
        Path path = Paths.get(params.get("csvfile"));
        if (Files.exists(path)){
            // use the new java 8 streams api to read the CSV column headings
            Stream<String> lines = Files.lines(path);
            List<String> columns = lines
                .findFirst()
                .map((line) -> Arrays.asList(line.split(",")))
                .get();
            columns.forEach((l)->System.out.println(l));
            // find the relevant sections from the CSV file
            // we are only interested in the row with Neda's name
            int nameIndex = columns.indexOf("name");
            int ageIndex columns.indexOf("age");
            int heightIndex = columns.indexOf("height");
            // we need to know the index positions of the 
            // have to re-read the csv file to extract the values
            lines = Files.lines(path);
            List<List<String>> values = lines
                .skip(1)
                .map((line) -> Arrays.asList(line.split(",")))
                .collect(Collectors.toList());
            values.forEach((l)->System.out.println(l));
        }
    }        
}

Gibt es eine Möglichkeit, das erneute Lesen der Datei nach dem Extrahieren der Kopfzeile zu vermeiden? Obwohl dies eine sehr kleine Beispieldatei ist, werde ich diese Logik auf eine große CSV-Datei anwenden.

Wird mithilfe der Streams-API eine Zuordnung zwischen den extrahierten Spaltennamen (im ersten Scan der Datei) und den Werten in den verbleibenden Zeilen erstellt?

Wie kann ich nur eine Zeile in Form von @ zurückgebeList<String> (Anstatt vonList<List<String>> enthält alle Zeilen). Ich würde es vorziehen, nur die Zeile als Zuordnung zwischen den Spaltennamen und den entsprechenden Werten zu finden. (Ein bisschen wie eine Ergebnismenge in JDBC). Ich sehe eine Collectors.mapMerger-Funktion, die hier hilfreich sein könnte, aber ich habe keine Ahnung, wie ich sie verwenden soll.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage