当前位置: 首页 > 知识库问答 >
问题:

如何通过使用OpenCsv记录无效记录的错误来创建有效CSV记录的列表?

齐高阳
2023-03-14

在我的 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 记录标头计数中的无效数据与记录文件不匹配,因此错误 java.lang.RuntimeException: com.opencsv.exceptions.CsvRequiredFieldEmptyException: 数据字段数与标题数不匹配。

编辑

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 行的数据不一致

共有2个答案

屠和洽
2023-03-14

在我看来,错误是由 CsvToBean 抛出的

快速阅读此内容,我认为这可能是由CSV文件中标题上的一些错误引起的。

闻枫
2023-03-14
  1. 添加到 CsvToBeanBuilder .withThrowExceptions(false) 以忽略运行时异常
  2. 解析 Bean
  3. 调用 getCapturedExceptions() 以获取在导入过程中会引发但被禁止的所有异常
  4. 遍历 CsvException 数组(解析后)并记录异常

请参阅下面的代码片段:

final CsvToBean<UserProvisioning> beans = 
    new CsvToBeanBuilder<UserProvisioning>(new FileReader("c:\\test.csv"))
        .withType(UserProvisioning.class)
        .withIgnoreQuotations(true)
        .withThrowExceptions(false) //1
        .build();

    final List<UserProvisioning> users = beans.parse();//2
    users.stream().forEach((user) -> {
        logger.info("Parsed data:" + user.toString());
    });

    beans.getCapturedExceptions().stream().forEach((exception) -> { //3
        logger.error("Inconsistent data:" + 
                      String.join("", exception.getLine()), exception);//4
    });
 类似资料:
  • 0.3 新版功能. 应用故障,服务器故障。早晚你会在产品中看见异常。即使你的代码是 100% 正确的, 你仍然会不时看见异常。为什么?因为涉及的所有一切都会出现故障。这里给出一些 完美正确的代码导致服务器错误的情况: 客户端在应用读取到达数据时,提前终止请求 数据库服务器超载,并无法处理查询 文件系统满了 硬盘损坏 后端服务器超载 你所用的库出现程序错误 服务器的网络连接或其它系统故障 而且这只是

  • 问题内容: 我真的很喜欢ng- model属性如何直接绑定到我的模型,并且用户可以立即获得有关其更改的反馈。对于我的用例来说,这是完美的。但是,我不希望将无效值放入模型中,因为它们可能会在计算中使用扳手。我以某种方式希望仅在表单控件中的值有效时才更新模型。对于无效值,可以在模型值保持固定的同时更改控制值。 如果我更改角度(1.2rc)NgModelController的$ setViewValue

  • 问题内容: 我想检查特定背景文件中的错误,但是标准错误流由前台程序控制,并且问题中文件中的错误未显示。不过,我可以使用该模块并将输出写入文件。我想知道如何使用它来记录所有异常,错误及其回溯。 问题答案: 记录程序中引发的 任何 异常可能是一个坏主意,因为Python还将异常用于正常控制流。 因此,您应该只记录 未捕获的 异常。一旦有了异常对象,就可以使用记录器的方法轻松地执行此操作。 要处理所有未

  •  当玩家点选菜单上的「系统 - 返回之前」后,可以返回上一个段落,通过记录就是指定这种自动存储位置的功能。  要使用通过记录功能,需要用到 record 指令、此外还要对 Config.tjs 的 recordHistoryOfStore 进行设定。  「系统 - 返回之前」这一菜单选项默认是不显示的,但是可以在 Config.tjs 中将 goBackMenuItem.visible 设定为 t

  • 问题内容: 我正在看一个问题:从SQLite表获取随机值,这使我想知道是否可以使用SQL复制记录。更具体地说,有没有一种可以转换这些记录的构造: 进入: 后者中的和记录的计数与前一组记录中的对应值匹配。 可以用SQL完成吗?如果是这样,怎么办? 编辑: Lucero问什么SQL方言?任何真的,但理想情况下,最不可知论的方法都是最好的。 另一个编辑: 是否可以在sqlite中的单个SQL语句中完成?

  • 问题内容: 我一直在阅读“错误日志记录”,并且想出了“ error_log”函数,它似乎是处理错误日志记录的好工具。但是,最流畅和最佳的使用方式是什么? 如果我有一个 这会将错误记录在my-errors.log文件中。但是,如果我有时需要更改文件位置,新文件夹或其他内容的位置,该怎么办?如果我有大量文件,则需要全部更改。 现在,我开始考虑使用变量来设置错误日志的路径。当然可以,但是如果我想在函数或

  • 可确认下载失败或无法与互联网连接时等,最新的10件错误历史记录。 轻触列表的错误项目,会显示详细内容。部分项目还可确认建议解决方法。

  • 我在类方法中使用active record import gem来导入从csv文件读取的列表数组,如下代码所示: 根据active record导入文档,我正在尝试将列表的标题和VIN字段设置为冲突目标。如果列表的VIN字段发生冲突,我希望进行更新,而不是创建。 但是现在,每次我运行CSV上传时,它都在从isting.import创建一个新的列表,而不检查它是否冲突。 我哪里出错了?