2016-04-07 10 views
1

Ich versuche, ein einfaches Parsing-Dienstprogramm zu erstellen, das eine zweispaltige CSV-Datei konvertiert und in eine Karte einfügt.Wie konvertieren CSV in eine Karte mit Java 8 Stream

public Map<String, String> getMapFromCSV(final String filePath) throws IOException { 
    return Files.lines(Paths.get(filePath)) 
       .map(line -> line.split(",")) 
       .collect(Collectors.toMap(line -> line[0], line -> line[1])); 
} 

Wie man sehen kann, um einen Strom I von Strings bin Erstellen jede Zeile auf einem Komma abgrenzt und in ein String-Array Transformieren und schließlich zu dem Index 0 und Wert Index 1.

Abbildungsschlüssel

Aus irgendeinem Grund, wenn ich diesen Test ausführen, ist der tatsächliche Wert Null. Ich habe ungültigen filePath ausgeschlossen, weil es in einem anderen Komponententest einwandfrei funktioniert und der Schlüsselwert in der CSV vorhanden ist. Ich habe es jetzt seit ein paar Stunden angestarrt, dachte, vielleicht könnte jemand hier meinen Fehler aufzeigen.

Auch bin ich ziemlich neu in Java 8, also wenn jemand eine bessere/sauberere Art des Schreibens weiß, würde ich das Feedback schätzen.

+3

Sie verlieren hier einen Dateideskriptor. 'Files.lines()' sollte in einer try-with-resources-Anweisung geöffnet werden. – fge

+1

Gibt es Whitespace in der Datei? – rgettman

+2

'null' kann darauf hinweisen, dass' map.get (key) '' key' in map nicht finden konnte. Versuchen Sie, die gesamte von 'util.getMapFromCSV (filePath) 'zurückgegebene Map zu drucken. – Pshemo

Antwort

2

Ok, ich habe lines.close() hinzugefügt und alle Leerzeichen aus dem CSV entfernt und es funktioniert! Seltsam, wenn man bedenkt, dass die CSV in meiner anderen Methode gut verarbeitet wurde. So sieht es aus:

public static Map<String, String> getMapFromCSV(final String filePath) throws IOException{ 

     Stream<String> lines = Files.lines(Paths.get(filePath)); 
     Map<String, String> resultMap = 
       lines.map(line -> line.split(",")) 
        .collect(Collectors.toMap(line -> line[0], line -> line[1])); 

     lines.close(); 

     return resultMap; 
    } 
+1

Sie sollten Ihre Antwort als richtig markieren –