2016-07-22 14 views
3

Ich versuche, eine Guava-Tabelle in CSV zu exportieren. Der Code unten funktioniert, aber es überspringt die erste Spalte, die ich auch in der Ausgabe sehen möchte. Kannst du irgendetwas vorschlagen?Guava-Tabelle zu CSV

EDIT: offensichtlich mit values() und keySet() funktioniert separat.

final RowSortedTable<String, String, Double> graph = TreeBasedTable.create(); 

graph.put("A", "0", 0.0); 
graph.put("A", "1", 1.0); 
graph.put("B", "0", 0.1); 
graph.put("B", "1", 1.1); 

final Appendable out = new StringBuilder(); 
try { 
    final CSVPrinter printer = CSVFormat.DEFAULT.print(out); 

    printer.printRecords(// 
      graph.rowMap().values()// 
        .stream()// 
        .map(x -> x.values())// 
        .collect(Collectors.toList())); 

} catch (final IOException e) { 
    e.printStackTrace(); 
} 

System.out.println(out); 

EDIT: dies funktioniert auch nicht:

 printer.printRecords(// 
       graph.rowMap().entrySet().stream().map(entry -> { 
         List a = Arrays.asList(entry.getKey()); 
         a.addAll(entry.getValue().values()); 
         return a; 
        }).collect(Collectors.toList()) 
       ); 
+0

Haben Sie Ihren Code debuggen zu überprüfen, ob diese Spalte noch vorhanden ist in der Liste an den Drucker übergeben oder nicht? – Thomas

+0

Woher kommen 'CSVPrinter' und' CSVPrinter'? –

+0

Ihr Code druckt "0.0,1.0" in der ersten Zeile und '0.1.1.1' in der zweiten, was ist Ihre gewünschte Ausgabe? – Xaerxess

Antwort

6

Sie wollen entrySet() statt values() verwenden, und ordnen Sie jeden Eintrag in eine Liste der wichtigsten und Werte:

printer.printRecords(graph.rowMap().entrySet() 
     .stream() 
     .map(entry -> ImmutableList.builder() 
       .add(entry.getKey()) 
       .addAll(entry.getValue().values()) 
       .build()) 
     .collect(Collectors.toList())); 
+0

Das ist es, danke! – LucasSeveryn

0
graph.rowMap().values() 

gibt nur Werte der Tabelle nicht die Schlüssel (erste Spalte), das ist so, wie Sie sehen es nicht in CSV.

+0

Ich weiß das, daher meine Frage wie kann ich beides zurückgeben. – LucasSeveryn

0

Sie ordnen nur den Werten zu, Sie überspringen die Schlüssel (und sie sind die erste Spalte). Sie wollen wahrscheinlich mit

graph.rowMap().entrySet().stream().map(entry -> { 
    List a = Arrays.asList(entry.getKey()); 
    a.addAll(entry.getValue().values()); 
    return a; 
}).collect(Collectors.toList()); 

Überprüfen Sie die Dokumentation für weitere Informationen

https://google.github.io/guava/releases/17.0/api/docs/com/google/common/collect/RowSortedTable.html

http://docs.oracle.com/javase/7/docs/api/java/util/SortedMap.html?is-external=true

+0

Danke, das sieht vielversprechend aus. Können Sie Ihre Antwort etwas erweitern? II setzen Sie Ihren Code in 'printer.printRecords (...)' Methode, es gibt nur 'java.util.stream.ReferencePipeline $ 3 @ 1808f31' – LucasSeveryn

+0

Vergessen Sie nicht, mit .collect zu beenden (Collectors.toList())) ; Ich habe das nicht der Kürze halber hinzugefügt, aber ich werde meine Antwort auf Vollständigkeit aktualisieren –

+0

dies zu tun gibt eine Ausnahme zurück Ich habe Angst ... eine Bearbeitung hinzugefügt. – LucasSeveryn

2

arbeiten Wenn Sie mehr Felder haben, können Sie immer die Tripple mit einer Karte wechseln . Dies ist ähnlich zu JSon, wo jedes Objekt als eine Karte beschrieben wird, deren Schlüssel die Attribute sind und die Werte werten.

class Tripple { 
     String value1; 
     String value2; 
     Double value3; 
    Tripple(String value1, String value2, Double value3) { 
     super(); 
     this.value1 = value1; 
     this.value2 = value2; 
     this.value3 = value3; 
    } 

    Map<String,Map<String,Integer>> map; 
RowSortedTable<String, String, Double> maprows; 
List<Tripple> triples = maprows.rowMap().entrySet().stream() 
                .map(t->{final List<Tripple> tripples = new ArrayList<>(); 
                  t.getValue().entrySet() 
                        .forEach(p->{tripples.add(new Tripple(t.getKey(),p.getKey(),p.getValue()));}); 
                  return tripples;}) 
                .flatMap(t->t.stream()) 
                .collect(Collectors.toList()); 
+0

Was ist, wenn es 150 Spalten gibt und nicht 3? – LucasSeveryn

+0

@LucasSeveryn Es ist keine große Sache Er kann sie immer in eine Karte setzen. Karte kann ein Objekt immer ersetzen. –

+0

@LucasSeveryn lassen Sie mich klären. Jedes Objekt kann als ein MAP wie in Json beschrieben werden. Wo die Schlüssel die Attributnamen und die Werte die Attributwerte sind. Sie können eine Map mit diesem Layout erstellen, wenn Sie eine nicht definierte Anzahl von Spalten haben. –