вложенный компонент super csv

у меня есть CSV

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

Я хочу прочитать его и сохранить в файл json. Я создал два курса бобов (идентификатор, имя, описание, цена, дата) и человека (имя, адрес)

при чтении с помощью bean reader я не могу установить адрес человека. (Украшенный) вывод

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)        
        };

person tarun    schedule 28.03.2016    source источник
comment
Похоже, это работа для CsvDozerBeanReader. На веб-сайте есть множество примеров Super CSV или см. этот ответ SO для краткого изложения.   -  person James Bassett    schedule 31.03.2016


Ответы (1)


SuperCSV — это первый виденный мной синтаксический анализатор, который позволяет создавать объект внутри объекта.

для того, что вы хотите, вы можете попробовать Apache Commons CSV или openCSV (CSVToBean) для сопоставления, но для этого вам нужно иметь сеттеры внутреннего класса (setName, setAddress) во внешнем классе, чтобы CSVToBean подобрать его. Это может или не может работать.

Что я обычно говорю людям, так это иметь простой POJO со всеми полями в csv - объект передачи данных. Пусть синтаксический анализатор создаст, а затем с помощью класса утилиты/построителя преобразует простой POJO во вложенный POJO, который вы хотите.

person Scott Conway    schedule 31.03.2016
comment
Привет Скотт, хорошая работа над Open CSV. Несколько лет назад я провел капитальный ремонт Super CSV, и первой реальной функцией, которую я добавил, было вложенное/индексированное сопоставление. Сейчас я покинул проект (вы, наверное, знаете, как он поддерживает проект так долго), но, оглядываясь назад, я больше всего горжусь этой функцией :) - person James Bassett; 04.04.2016