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

Ich bin versucht, die neue Java 8 Streams API (für die ich bin ein absoluter Neuling) analysieren für eine bestimmte Zeile (die mit "Neda" in der name-Spalte) in eine CSV-Datei. Anhand der folgenden Artikel für die motivation, die ich geändert und behoben einige Fehler und so konnte ich parse die Datei mit 3 Spalten 'name', 'Alter' und 'Höhe'.

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

Den Analyse-code ist 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, um zu vermeiden, re-Lektüre, die Datei nach der Extraktion der Kopfzeile? Das ist zwar eine sehr kleine Beispiel-Datei, ich werde die Anwendung dieser Logik zu einer großen CSV Datei.

Ist es Technik, die die Verwendung der streams-API zu erstellen, die eine Zuordnung zwischen den extrahierten Spaltennamen (in der ersten überprüfung der Datei), um die Werte in die restlichen Zeilen?

Wie kann ich wieder nur eine Zeile in der form List<String> (statt List<List<String>> mit allen Zeilen). Ich würde lieber nur die Zeile als eine Zuordnung zwischen den Namen der Spalten und Ihre entsprechenden Werte. (ein bisschen wie ein ResultSet in JDBC). Ich sehe ein Sammler.mapMerger-Funktion, die hilfreich sein könnten hier, aber ich habe keine Ahnung, wie es zu benutzen.

  • Warum nicht speichern Sie die Linien auf der ersten Lesen und stream ab?
  • Beachten Sie, dass dies nicht funktioniert für einige ansonsten perfekt gültige CSV-Dateien, wie man mit der Linie "Neda",14,66
InformationsquelleAutor johnco3 | 2016-01-06
Schreibe einen Kommentar