2016-07-22 9 views
3

グアバテーブルをCSVにエクスポートしようとしています。以下のコードは動作しますが、出力に表示したい最初の列もスキップします。あなたは何かを提案できますか?グアバテーブルからCSVへ

EDIT:明らかにvalues()keySet()を別々に使用しています。

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:これはどちらか動作しません:テーブルの

 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

あなたは、その列がまだ存在するかどうかを確認するようにコードをデバッグでしたプリンタに渡されたリストの中にあるかどうか? – Thomas

+0

'CSVPrinter'と' CSVPrinter'はどこから来たのですか? –

+0

あなたのコードは最初の行に '0.0,1.0'を、秒に' 0.1,1.1'を出力します。希望する出力は何ですか? – Xaerxess

答えて

6

あなたはentrySet()代わりのvalues()を使用して、そのキーと値のリストに各エントリをマッピングすることをお勧めします:

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

これは、ありがとうございます! – LucasSeveryn

0
graph.rowMap().values() 

戻り値だけではないキー(最初の列)それはあなたがCSVでそれを見ることはありません方法です。

+0

私はそれを知っているので、私の質問はどのように私は両方を返すのですか? – LucasSeveryn

0

値にマッピングするだけで、キーをスキップしています(最初の列です)。あなたはより多くのフィールドを持っている場合は、必ず地図でトリプルを切り替えることができます

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

さらなる情報のためのマニュアルを参照してください

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

ありがとう、これは有望そうです。どのようにしても、あなたの答えは少し拡大できますか?あなたのコードを 'printer.printRecords(...)'メソッドに入れると 'java.util.stream.ReferencePipeline $ 3 @ 1808f31'だけが返されます – LucasSeveryn

+0

.collect(Collectors.toList())で終わるのを忘れないでください) ; 私はそれを簡潔にするために追加しませんでしたが、完了するために私の答えを更新します –

+0

これを行うことは例外を返す私は恐れている...編集を追加しました。 – LucasSeveryn

2

で動作するように、おそらくたいと思う 。これはJSonと似ていますが、各オブジェクトはキーが属性で値が値であるマップが記述されています。

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

3つではなく150の列がある場合はどうなりますか? – LucasSeveryn

+0

@LucasSeverynそれは大したことではありません。彼はいつもそれらを地図に入れることができます。マップは常にオブジェクトを置き換えることができます。 –

+0

@LucasSeveryn私に明確にさせてください。各オブジェクトは、JsonのようにMAPとして記述することができます。ここで、キーは属性名であり、値は属性値です。あなたが行うことができるのは、定義されていない数のccolumnがある場合、そのレイアウトでMapを作成することです。 –