【发布时间】:2019-11-11 19:21:12
【问题描述】:
在我的 CSV 中,我的数据不一致,因此我必须在迭代记录时记录错误,并希望创建有效 CSV 记录的 POJO 列表。我正在使用 OpenCsv 来处理 CSV 文件。 如果有任何错误,我已经添加了 try-catch 块来记录错误,但在 while(iterator.hasNext()) 存在异常/错误,因为下一条记录有一些格式不正确的数据。
那么如何记录错误并继续处理下一条记录呢?
List<UserProvisioning> list = new ArrayList<>();
CsvToBean<UserProvisioning> beans = new CsvToBeanBuilder<UserProvisioning>(
new FileReader(file.getAbsolutePath())).withType(UserProvisioning.class)
.withIgnoreQuotations(true).build();
Iterator<UserProvisioning> iterator = beans.iterator();
while (iterator.hasNext()) {
try {
UserProvisioning userProvisioning = (UserProvisioning) iterator.next();
System.out.println(userProvisioning.getFIRST_NAME());
list.add(userProvisioning);
} catch (Exception e) {
// TODO Auto-generated catch block
logger.error("Error occured...)
}
}
如果我使用 .withThrowExceptions(false),我可以处理所有有效记录,但无法记录错误。
错误
java.lang.RuntimeException: com.opencsv.exceptions.CsvRequiredFieldEmptyException: Number of data fields does not match number of headers.
at com.opencsv.bean.concurrent.ProcessCsvLine.run(ProcessCsvLine.java:101)
at com.opencsv.bean.CsvToBean$CsvToBeanIterator.readLineWithPossibleError(CsvToBean.java:551)
at com.opencsv.bean.CsvToBean$CsvToBeanIterator.readSingleLine(CsvToBean.java:571)
at com.opencsv.bean.CsvToBean$CsvToBeanIterator.next(CsvToBean.java:591)
at com.apds.partner.nycdoc.main.NycDocApplication.main(NycDocApplication.java:90)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
Caused by: com.opencsv.exceptions.CsvRequiredFieldEmptyException: Number of data fields does not match number of headers.
at com.opencsv.bean.HeaderColumnNameMappingStrategy.verifyLineLength(HeaderColumnNameMappingStrategy.java:110)
at com.opencsv.bean.AbstractMappingStrategy.populateNewBean(AbstractMappingStrategy.java:313)
at com.opencsv.bean.concurrent.ProcessCsvLine.processLine(ProcessCsvLine.java:132)
at com.opencsv.bean.concurrent.ProcessCsvLine.run(ProcessCsvLine.java:85)
... 9 more
如何通过使用 OpenCsv 记录无效记录的错误来创建有效 csv 记录的列表?
根据我的理解 iterator.hasNext() 尝试通过将 csv 记录列映射到 POJO 字段来检查下一个元素是否存在,并且由于 csv 记录标题中的数据无效,因此计数与记录文件不匹配,因此错误 @987654323 @
编辑
OpenCSV 4.6 版
样本记录:
ID1,ID2,FIRST_NAME,LAST_NAME,BIRTH_DATE,HA1,HA2,TYPE,STATUS,DT,LEVEL
3491905454,04572538R,L,L,1964-08-01,RNDC,M4SL,GP ,DEP,,
3491901894,04353902J,TO,TO,1962-10-20,AMKC,QUAD-L3,GP ,DE,,
3491903493,01940960Y,JAM"ES,TO,1985-03-12,GRVC,13A,PS ,DPV,,
8951900652,08661334Z,"ROT,TEST",RODRIGUEZ,1971-09-17,AMKC,1 TOP,GP ,DE,,
4411801431,02661015Y,CET,TEC,1964-06-21,RNDC,M4NU,GP ,DE,,
9801900155,06467584H,RAT,BAT,1969-12-01,GRVC,8A,GP ,DE,,GSL3
第 4 行和第 5 行数据不一致
【问题讨论】:
-
尝试在
while (iterator.hasNext())@Sagar周围包裹另一个try catch块 -
@hydroPenguin 然后它会再次记录该行的错误并停止迭代循环
-
这是一种有趣的行为。假设
hasNext()不应该抛出任何异常,并且抛出的所有异常都通过以下try catch 块处理,您只记录它而不抛出它。最好的办法是使用我刚才建议并由另一个答案getCapturedExceptios()发布的方法。