Как сделать парсинг csv файла с двойными кавычками, в которых находится список, в List с помощью openCSV Java?

Пример csv файла:

Marianna Villalobos,38,"Web,Android"
Sanah Jacobs,41,"Java,Python,iOS"
Romany Burnett,36,"Web,Python"

Мой класс:

public class StudentPOJO {

    @CsvBindByPosition(position = 0)
    private String name;
    @CsvBindByPosition(position = 1)
    private int age;
    @CsvBindAndJoinByPosition(position = "2", elementType = String.class)
    private List<String> courses;

    //getters and setters
}

Пытаюсь получить List<StudentPOJO>:

List<StudentPOJO> students = new CsvToBeanBuilder<StudentPOJO>(new FileReader(FILE_PATH))
                .withType(StudentPOJO.class)
                .build()
                .parse();

ошибка в строке ".build()":

Exception in thread "pool-1-thread-4" java.lang.RuntimeException: com.opencsv.exceptions.CsvDataTypeMismatchException: Conversion of Web,Python to java.util.List failed. at com.opencsv.bean.concurrent.ProcessCsvLine.run(ProcessCsvLine.java:103) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:830) Caused by: com.opencsv.exceptions.CsvDataTypeMismatchException: Conversion of Web,Python to java.util.List failed. at com.opencsv.bean.ConverterPrimitiveTypes.convertToRead(ConverterPrimitiveTypes.java:95) at com.opencsv.bean.BeanFieldSingleValue.convert(BeanFieldSingleValue.java:91) at com.opencsv.bean.AbstractBeanField.setFieldValue(AbstractBeanField.java:169) at com.opencsv.bean.AbstractMappingStrategy.setFieldValue(AbstractMappingStrategy.java:449) at com.opencsv.bean.AbstractMappingStrategy.populateNewBean(AbstractMappingStrategy.java:317) at com.opencsv.bean.concurrent.ProcessCsvLine.processLine(ProcessCsvLine.java:134) at com.opencsv.bean.concurrent.ProcessCsvLine.run(ProcessCsvLine.java:87) ... 3 more Caused by: org.apache.commons.beanutils.ConversionException: Can't convert value 'Web,Python' to type interface java.util.List at org.apache.commons.beanutils.converters.AbstractConverter.conversionException(AbstractConverter.java:474) at org.apache.commons.beanutils.converters.StringConverter.convertToType(StringConverter.java:96) at org.apache.commons.beanutils.converters.AbstractConverter.convert(AbstractConverter.java:169) at org.apache.commons.beanutils.converters.ConverterFacade.convert(ConverterFacade.java:61) at org.apache.commons.beanutils.ConvertUtilsBean.convert(ConvertUtilsBean.java:491) at com.opencsv.bean.ConverterPrimitiveTypes.convertToRead(ConverterPrimitiveTypes.java:86) ... 9 more Exception in thread "pool-1-thread-2" java.lang.RuntimeException: com.opencsv.exceptions.CsvDataTypeMismatchException: Conversion of Web,Android,iOS to java.util.List failed. at com.opencsv.bean.concurrent.ProcessCsvLine.run(ProcessCsvLine.java:103) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:830) Caused by: com.opencsv.exceptions.CsvDataTypeMismatchException: Conversion of Web,Android,iOS to java.util.List failed. at com.opencsv.bean.ConverterPrimitiveTypes.convertToRead(ConverterPrimitiveTypes.java:95) at com.opencsv.bean.BeanFieldSingleValue.convert(BeanFieldSingleValue.java:91) at com.opencsv.bean.AbstractBeanField.setFieldValue(AbstractBeanField.java:169) at com.opencsv.bean.AbstractMappingStrategy.setFieldValue(AbstractMappingStrategy.java:449) at com.opencsv.bean.AbstractMappingStrategy.populateNewBean(AbstractMappingStrategy.java:317) at com.opencsv.bean.concurrent.ProcessCsvLine.processLine(ProcessCsvLine.java:134) at com.opencsv.bean.concurrent.ProcessCsvLine.run(ProcessCsvLine.java:87) ... 3 more Caused by: org.apache.commons.beanutils.ConversionException: Can't convert value 'Web,Android,iOS' to type interface java.util.List at org.apache.commons.beanutils.converters.AbstractConverter.conversionException(AbstractConverter.java:474) at org.apache.commons.beanutils.converters.StringConverter.convertToType(StringConverter.java:96) at org.apache.commons.beanutils.converters.AbstractConverter.convert(AbstractConverter.java:169) at org.apache.commons.beanutils.converters.ConverterFacade.convert(ConverterFacade.java:61) at org.apache.commons.beanutils.ConvertUtilsBean.convert(ConvertUtilsBean.java:491) at com.opencsv.bean.ConverterPrimitiveTypes.convertToRead(ConverterPrimitiveTypes.java:86) ... 9 more Exception in thread "pool-1-thread-3" java.lang.RuntimeException: com.opencsv.exceptions.CsvDataTypeMismatchException: Conversion of Web,Python,iOS to java.util.List failed. at com.opencsv.bean.concurrent.ProcessCsvLine.run(ProcessCsvLine.java:103) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:830) Caused by: com.opencsv.exceptions.CsvDataTypeMismatchException: Conversion of Web,Python,iOS to java.util.List failed. at com.opencsv.bean.ConverterPrimitiveTypes.convertToRead(ConverterPrimitiveTypes.java:95) at com.opencsv.bean.BeanFieldSingleValue.convert(BeanFieldSingleValue.java:91) at com.opencsv.bean.AbstractBeanField.setFieldValue(AbstractBeanField.java:169) at com.opencsv.bean.AbstractMappingStrategy.setFieldValue(AbstractMappingStrategy.java:449) at com.opencsv.bean.AbstractMappingStrategy.populateNewBean(AbstractMappingStrategy.java:317) at com.opencsv.bean.concurrent.ProcessCsvLine.processLine(ProcessCsvLine.java:134) at com.opencsv.bean.concurrent.ProcessCsvLine.run(ProcessCsvLine.java:87) ... 3 more Caused by: org.apache.commons.beanutils.ConversionException: Can't convert value 'Web,Python,iOS' to type interface java.util.List at org.apache.commons.beanutils.converters.AbstractConverter.conversionException(AbstractConverter.java:474) at org.apache.commons.beanutils.converters.StringConverter.convertToType(StringConverter.java:96) at org.apache.commons.beanutils.converters.AbstractConverter.convert(AbstractConverter.java:169) at org.apache.commons.beanutils.converters.ConverterFacade.convert(ConverterFacade.java:61) at org.apache.commons.beanutils.ConvertUtilsBean.convert(ConvertUtilsBean.java:491) at com.opencsv.bean.ConverterPrimitiveTypes.convertToRead(ConverterPrimitiveTypes.java:86) ... 9 more Exception in thread "pool-1-thread-1" Exception in thread "main" java.lang.RuntimeException: Error parsing CSV line: 3. [Jesse Singh,23,Web,Android,iOS] at com.opencsv.bean.CsvToBean.parse(CsvToBean.java:365) at Main.main(Main.java:22)


Ответы (1 шт):

Автор решения: Roman-Stop RU aggression in UA

Неправильно используете CsvBindAndJoinByPosition. Эта аннотация позволяет несколько колонок объединить в одну коллекцию. У вас же задача противоположная - нужно одну колонку со значениями отделенными запятыми разделить. То есть значение Java,Python,iOS из последней колонки нужно разделить.

Так что правильно будет так:

public class StudentPOJO {

    @CsvBindByPosition(position = 0)
    private String name;
    @CsvBindByPosition(position = 1)
    private int age;
    @CsvBindAndSplitByPosition(position = 2, elementType = String.class, collectionType = LinkedList.class, splitOn = ",")
    private List<String> courses;

    //getters and setters
}
→ Ссылка