2016-03-28 22 views
0

Bir csv Okudum ve json dosyaya saklamak istediğinizsüper csv iç içe fasulye

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

var. İki fasülye kursu (id, isim, açıklama, fiyat, tarih) ve kişi (isim, adres)

Fasulye okuyucu tarafından okunurken, bu kişinin adresini ayarlayamıyorum. (beautified) çıkış

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] 
     ] 
] 

ben adres adıyla ayarlamak istediğiniz olduğu

Kodum:

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" için bir işe benziyor. Super CSV'de [website] (http://super-csv.github.io/super-csv/examples_dozer.html) çok sayıda örnek var veya [bu SO cevabı] 'na göz atın (http://stackoverflow.com/ sorular/200609/can-you-tavsiye-a-java-kütüphane-okuma-ve-muhtemelen-yazma-csv-dosyaları/12504722 # 12504722) bir yıkım için. –

cevap

0

SuperCSV Bir nesne oluşturmanızı sağlar gördüğüm ilk ayrıştırıcısıdır bir nesne içinde.

Ne istediğinizi bulmak için Apache Commons CSV'yi veya openCSV'yi (CSVToBean) eşleştirebilirsiniz, ancak bunu yapmak için CSVToBean'ın seçmesi için dış sınıftaki (setName, setAddress) iç sınıfa sahip olmanız gerekir. o kadar. Bu işe yarayabilir ya da olmayabilir.

Normalde insanlara veri aktarım nesnesi olan csv içindeki tüm alanları içeren düz bir POJO'ya sahip olmalarını söylüyorum. Ayrıştırıcıyı oluşturmak için bir yardımcı/oluşturucu sınıfı kullanın, düz POJO'yu istediğiniz yuvalanmış POJO'ya dönüştürün.

+1

Merhaba Scott, Açık CSV'de güzel çalışmalar. Birkaç yıl önce Süper CSV'nin bir revizyonunu yaptım ve iç içe/indeksli haritalama, eklediğim ilk gerçek özellikti. Projeyi şimdi terk ettim (muhtemelen bir projeyi nasıl uzun süredir sürdürdüğünü biliyorsunuz), ama geriye dönüp baktığımda en çok gurur duyduğum özellik budur :) –