2016-03-28 13 views
0

Ich habe eine csvSuper csv verschachtelt Bohne

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

ich es lesen wollen, und speichern Sie es auf JSON-Datei. Ich habe zwei Bohne Kurs (ID, Name, Beschreibung, Preis, Datum) und Person (Name, Adresse) erstellt

beim Lesen von Bean-Reader kann ich nicht die Person Adresse einstellen. Die (verschönerte) Ausgang ist

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

ich die Adresse mit dem Namen

Mein Code festlegen möchten:

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

Sieht aus wie ein Job für 'CsvDozerBeanReader'. Es gibt viele Beispiele auf der Super CSV [Website] (http://super-csv.github.io/super-csv/examples_dozer.html), oder schaut euch [diese SO-Antwort] an (http://stackoverflow.com/ Fragen/200609/can-you-recommend-a-Java-Bibliothek-für-lesen-und-möglicherweise-schreiben-csv-Dateien/12504722 # 12504722) für eine Zusammenfassung. –

Antwort

0

SuperCSV ist der erste Parser ich gesehen habe, dass Sie ein Objekt erstellen können innerhalb eines Objekts.

für was Sie wollen, können Sie Apache Commons CSV oder openCSV (CSVToBean) zu map versuchen, aber dazu müssen Sie die Setter der inneren Klasse (setName, setAddress) in der äußeren Klasse, so dass die CSVToBean zu wählen es auf. Das kann oder kann nicht funktionieren.

Was ich normalerweise Leuten erzähle ist, ein einfaches POJO zu haben, das alle Felder im csv hat - ein Datenübertragungsgegenstand. Lassen Sie den Parser erstellen, der dann eine Dienstprogramm-/Builder-Klasse verwendet, um den einfachen POJO in den gewünschten verschachtelten POJO umzuwandeln.

+1

Hallo Scott, nette Arbeit an Open CSV. Ich habe vor ein paar Jahren eine Überholung von Super CSV durchgeführt und das nested/indexed Mapping war das erste wirkliche Feature, das ich hinzugefügt habe. Ich habe das Projekt jetzt verlassen (Sie wissen wahrscheinlich, wie es ein Projekt so lange aufrecht erhält), aber im Rückblick ist das das Feature, auf das ich am meisten stolz bin :) –