忽略CSV文件中的无效对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了忽略CSV文件中的无效对象相关的知识,希望对你有一定的参考价值。

因此,我得到了一个.csv,可以在其上基于列进行迭代和创建对象。现在,在要生成的对象的构造函数中,我正在检查一些条件,如果不满足上述条件,则抛出Exception。

现在,我一直在问自己-假设该列表中有一些对象会引发Exception,是否有可能停止通过即将创建的对象的构造函数,并且只需转到.csv中的下一行并继续建立我的列表?

因此简而言之:

  • 浏览.csv
  • 基于列构建对象
  • 如果无法创建对象(因为在构造函数中引发了异常),请忽略该对象并转到列表中的下一个元素

这可能吗?

谢谢!

答案

我实际上找到了解决方案。我把这行代码放在try.catch-block中(使用return Object xyz)从.csv获取数据的位置-这样,程序就不会终止。但是,由于此行位于必须返回对象的函数中,因此我需要在try-catch-block之外返回一个对象,这就是为什么我返回null的原因。现在,我主目录中的列表中充满了有效的对象,但也充满了一些空对象。

然后,我通过使用.stream().map(SimpleCsvParser::parseLine).filter(p -> p != null).collect(Collectors.toList());在填充列表的同时过滤掉所有空对象,从而从主列表中“删除”了空对象。

谢谢!

另一答案

我需要在try-catch-block之外返回一个对象,这就是为什么我返回null的原因。

重新组织代码,以便您not总是必须返回一个新对象。捕获新对象创建失败的陷阱。如果抛出异常,则在添加到新对象的集合时跳过该特定循环。

让我们为演示创建Person类。请注意如何在构造函数中,我们寻找有效数据,如果未收到,则抛出IllegalArgumentException。这称为IllegalArgumentException

data-validation

以及一些假数据。我们希望第三行失败,名字为package work.basil.example; import java.util.Objects; public class Person public String givenName, surname; // -------| Constructors |------------ public Person ( String givenName , String surname ) if ( Objects.isNull( givenName ) || givenName.isEmpty() ) throw new IllegalArgumentException(); if ( Objects.isNull( surname ) || surname.isEmpty() ) throw new IllegalArgumentException(); this.givenName = givenName; this.surname = surname; // -------| Accessors |------------ // Read-only, no setters. public String getGivenName ( ) return givenName; public String getSurname ( ) return surname; // -------| Object |----------------- @Override public boolean equals ( Object o ) if ( this == o ) return true; if ( o == null || getClass() != o.getClass() ) return false; Person person = ( Person ) o; return givenName.equals( person.givenName ) && surname.equals( person.surname ); @Override public int hashCode ( ) return Objects.hash( givenName , surname ); @Override public String toString ( ) return "Person " + "givenName='" + givenName + '\'' + " | surname='" + surname + '\'' + " "; ,但姓氏字段为空。我们的Zero类要求两个Person对象都是非null和非空的。

String

使用String input = "Alice,Anderson\r\n" + // Standard CSV requires CRLF as newline. "Bob,Barker\r\n" + "Zero,\r\n" + "Carol,Carrington"; 库来完成阅读输入的工作。

➥注意Apache Commons CSVcsvRecord.get调用周围的内部try-catch。如果这些行失败,请向我们的new Person 我们跳过添加Person对象。循环继续到CSV文件中的下一个输入。

在任何时候都不会尝试处理List类型的null对象。如果准备就绪时没有有效的Person对象,则继续。

Person

运行时。

INFO导入在第3行上失败。异常:java.lang.IllegalArgumentException

人= [人namedName ='Alice'|姓=“安德森”,人物给定名字=“鲍勃” |姓=“巴克”,人物给定名字=“卡罗尔” |姓='卡灵顿']

以上是关于忽略CSV文件中的无效对象的主要内容,如果未能解决你的问题,请参考以下文章

使用 awk 忽略 CSV 文件字段中的逗号

加载数据文件语法 - 第 1 行 CSV 中的无效字段计数

排查 CSV 中的无效行

忽略空列以将数据导出到 php mysql 中的 csv 文件

使用Shell脚本忽略csv文件中的第一行(标题)

第 1 行的 CSV 输入中的列数无效错误