为什么OpenCSV会为具有小数的格式正确的CSV文件抛出CsvDataTypeMismatchException



我正试图使用OpenCSV来处理用分号分隔的CSV文件,并且我已经用相关注释编写了我的代表性bean的字段——用@CsvBindAndSplitByName——它在Doubles列表中似乎失败了,但在Strings列表中却没有。为什么会这样?

我的豆子:

import com.opencsv.bean.CsvBindAndSplitByName;
import com.opencsv.bean.CsvBindByName;
import java.util.List;
public class TestBean {
@CsvBindByName(column = "name", required = true)
private String name;
@CsvBindAndSplitByName(elementType = String.class, column = "desc", writeDelimiter = ",")
private List<String> descriptions;
@CsvBindAndSplitByName(elementType = Double.class, column = "values", writeDelimiter = ",")
private List<Double> values;
}

我的数据(test.csv(:

name; desc; values
potato; langez, canou, passen; 3.55, 2.76, 1.92

读取文件并进行处理:

import com.opencsv.bean.CsvToBeanBuilder;
import java.io.FileNotFoundException;
import java.util.List;
import java.io.FileReader;
public class TestBeanReader {
public static void main(String[] args) throws FileNotFoundException {
List<TestBean> locations = new CsvToBeanBuilder<TestBean>(new FileReader("test.csv")).withSeparator(';').withType(TestBean.class).build().parse();
}
}

输出:

Exception in thread "pool-1-thread-1" Exception in thread "main" java.lang.RuntimeException: com.opencsv.exceptions.CsvDataTypeMismatchException: Conversion of 3.55, to java.lang.Double failed.
at com.opencsv.bean.util.OpencsvUtils.handleException(OpencsvUtils.java:128)
at com.opencsv.bean.concurrent.ProcessCsvLine.run(ProcessCsvLine.java:108)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: com.opencsv.exceptions.CsvDataTypeMismatchException: Conversion of 3.55, to java.lang.Double failed.
at com.opencsv.bean.ConverterPrimitiveTypes.convertToRead(ConverterPrimitiveTypes.java:128)
at com.opencsv.bean.BeanFieldSplit.convert(BeanFieldSplit.java:203)
at com.opencsv.bean.AbstractBeanField.setFieldValue(AbstractBeanField.java:182)
at com.opencsv.bean.AbstractMappingStrategy.setFieldValue(AbstractMappingStrategy.java:631)
at com.opencsv.bean.AbstractMappingStrategy.populateNewBean(AbstractMappingStrategy.java:334)
at com.opencsv.bean.concurrent.ProcessCsvLine.processLine(ProcessCsvLine.java:131)
at com.opencsv.bean.concurrent.ProcessCsvLine.run(ProcessCsvLine.java:87)
... 3 more
Caused by: org.apache.commons.beanutils.ConversionException: Error converting from 'String' to 'Double' For input string: "3.55,"
at org.apache.commons.beanutils.converters.AbstractConverter.handleError(AbstractConverter.java:282)
at org.apache.commons.beanutils.converters.AbstractConverter.convert(AbstractConverter.java:177)
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:118)
... 9 more

从我在TestBean类中看到的内容来看,您使用writeDelimiter = ","来分隔各个列。这是有效的,但不排除分隔符(在您的情况下为","(,因此它尝试解析";3.55;而不是";3.55〃;。列表中较早字符串的相同名称是";langez"canou"passen";而不是";langez"canou"passen";。我建议使用";splitOn="quot;其中不包括逗号。

@CsvBindAndSplitByName(elementType = Double.class, column = "values", splitOn = ",")
private List<Double> values;

最新更新