2016-03-28 7 views
0

は、私は、CSV、私はそれを読んで、JSON形式のファイルに保存したいスーパーCSVネストされた豆

id,name,description,price,date,name,address 
1,SuperCsv,Write csv file,1234.56,28/03/2016,amar,jp nagar 

を持っています。 ビーンリーダーで読んだときに、2つのコース(ID、名前、説明、価格、日付)と人(名前、住所)を作成しました

私は人の住所を設定できません。 (美化)出力が

Course [id=1, 
     name=SuperCsv, 
     description=Write csv file, 
     price=1234.56, 
     date=Mon Mar 28 00:00:00 IST 2016, 
     person=[ 
      Person [name=amar, address=null], 
      Person [name=null, address=jpnagar] 
     ] 
] 

私はアドレスを名前で設定したいです

マイコード:

public static void readCsv(String csvFileName) throws IOException { 

     ICsvBeanReader beanReader = null; 
     try { 
      beanReader = new CsvBeanReader(new FileReader(csvFileName), CsvPreference.STANDARD_PREFERENCE); 

      // the header elements are used to map the values to the bean (names must match) 
      final String[] header = beanReader.getHeader(true); 
      final CellProcessor[] processors = getProcessors(); 

      final String[] fieldMapping = new String[header.length]; 

      for (int i = 0; i < header.length; i++) { 
       if (i < 5) { 
        // normal mappings 
        fieldMapping[i] = header[i]; 

       } else { 
        // attribute mappings 
        fieldMapping[i] = "addAttribute"; 

       }} 
      ObjectMapper mapper=new ObjectMapper(); 
      Course course; 
      List<Course> courseList=new ArrayList<Course>(); 
      while ((course = beanReader.read(Course.class, fieldMapping, processors)) != null) { 
       // process course 
       System.out.println(course); 
       courseList.add(course); 


      } 
private static CellProcessor[] getProcessors(){ 

     final CellProcessor parsePerson = new CellProcessorAdaptor() { 
      public Object execute(Object value, CsvContext context) { 
       return new Person((String) value,null); 
      } 
     }; 

     final CellProcessor parsePersonAddress = new CellProcessorAdaptor() { 
      public Object execute(Object value, CsvContext context) { 
       return new Person(null,(String) value); 
      } 
     }; 

     return new CellProcessor[] { 
       new ParseInt(), 
       new NotNull(), 
       new Optional(), 
       new ParseDouble(), 
       new ParseDate("dd/MM/yyyy"), 
       new Optional(parsePerson), 
       new Optional(parsePersonAddress)   
     }; 
+0

'CsvDozerBeanReader'の仕事のようです。 Super CSV [Webサイト](http://super-csv.github.io/super-csv/examples_dozer.html)にはたくさんの例がありますが、[this so answer](http://stackoverflow.com/質問/ 200609 /あなたのためのJavaライブラリを推奨し、読み書き可能なCSVファイル/ 12504722#12504722)をダウンロードしてください。 –

答えて

0

SuperCSVはあなたがオブジェクトを作成することができます私が見た最初のパーサーですオブジェクト内で

Apache Commons CSVまたはopenCSV(CSVToBean)をマップすることができますが、これを行うには、外部クラスに内部クラス(setName、setAddress)のセッターを置く必要があるため、CSVToBeanを選択しますそれをアップ。それは動作しても動作しなくてもよい。

私が普通に言うことは、データ転送オブジェクトであるcsvのすべてのフィールドを持つ単純なPOJOを持つことです。パーサがそれを作成してから、ユーティリティ/ビルダー・クラスを使用してプレーンなPOJOを必要なネストされたPOJOに変換します。

+1

こんにちはスコット、オープンCSVの素晴らしい仕事。私は数年前にSuper CSVのオーバーホールを行い、ネストされた/索引付けされたマッピングが私が追加した最初の本当の機能でした。私は今プロジェクトを残しました(あなたはおそらくそれが長い間プロジェクトを維持していることを知っています)。しかし、これを振り返ると、私が最も誇りに思っている機能です:) –

関連する問題