Как сделать парсинг 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 шт):
Неправильно используете 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
}