2016-03-28 83 views
0

我有一个CSV超级CSV嵌套豆

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

我想读它,并将其存储到JSON文件。 我已经创建了两个bean课程(编号,名称,描述,价格,日期)和人员(姓名,地址)

由读者阅读我无法设置个人地址。 的(美化)输出

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

我想ADRESS与名称设置

我的代码:

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 [网站](http://super-csv.github.io/super-csv/examples_dozer.html)上有很多示例,或查看[此SO回答](http://stackoverflow.com/问题/ 200609/can-you-recommend-a-java-library-for-reading-and-possibly-writing-csv-files/12504722#12504722)。 –

回答

0

SuperCSV是第一个解析器我所看到的,可以让你创建一个对象在一个对象内。

对于你想要的东西你可以尝试Apache Commons CSV或openCSV(CSVToBean)来映射,但要做到这一点,你需要在外部类中有内部类(setName,setAddress)的setter,以便CSVToBean可以选择它起来。这可能会或可能不会工作。

我通常告诉人们有一个普通的POJO,它拥有csv中的所有字段 - 一个数据传输对象。让解析器创建,然后使用实用程序/构建器类将普通POJO转换为所需的嵌套POJO。

+1

嗨斯科特,很好的Open CSV工作。几年前,我对Super CSV进行了大修,嵌套/索引映射是我添加的第一个真正的功能。我现在离开了这个项目(你可能知道它是如何维护一个项目的),但回头看看这是我最引以为傲的功能:) –