如何有效地读取一个巨大的CSV文件,并基于Java中的用户定义类将CSV值转换为对象

How to read a huge CSV file efficiently and convert CSV values into objects based on a user-defined class in Java

提问人:ychaulagain 提问时间:12/24/2022 更新时间:12/24/2022 访问量:198

问:

我必须读取一个包含大约 700,000 条记录的大型 CSV 文件,并将 CSV 数据与 API 响应进行比较。我能够使用 OpenCSV 并使代码正常工作。但是,反序列化过程非常缓慢。仅反序列化数据大约需要一个小时。我一直在使用以下代码来读取和反序列化我的 CSV。

     List<ProjectVO> csvValue = new CsvToBeanBuilder(new FileReader("project.csv"))
       .withType(ProjectVO.class).build().parse();

有没有其他有效的方法可以替代它?

我的班级如下所示:PersonVO

.
.
.
@JsonIgnoreProperties(ignoreUnknown = true)
public class ProjectVO {
@JsonProperty("actualCompletionDate")
@CsvBindByName(column = "actualCompletionDate")
private String actualCompletionDate;
.
.
.

我正在比较我的 CSV 数据和 JSON 响应,如下所示:

assertEquals("The value for column 'actualCompletionDate' has the same data in both files for the ID: "
   + jsonValue.getId(), csvValue.getActualCompletionDate(), jsonValue.getActualCompletionDate());
java-11 opencsv csvreader csv 解析器

评论

0赞 Anand Sowmithiran 12/24/2022
您应该使用流式解析器一次读取整个集合(例如 List)。
0赞 Mike Kim 12/24/2022
当你做一个“裸骨”实验版本,用绝对的最低限度来解析(忽略所有功能要求,只是为了得到一个基线基准)时,性能如何?
2赞 Loren Pechtel 12/24/2022
你的第一步应该是分析你的代码,以找出什么需要时间。
0赞 Mike Kim 12/24/2022
Re Anand 的建议,这是他 stackoverflow.com/questions/39673372/ 谈论的一个例子......
0赞 life888888 12/24/2022
stackoverflow.com/questions/19486077/...,@YAMM,anwser,有测试读取文本文件,也许你可以将文件读入LinkedList或ArrayList,然后使用多线程从ArrayList中读取它并将其传递给CsvToBeanBuilderrun: BufferedReader.readLine() into LinkedList, lines: 1000000, estimatedTime: 0.105118655

答: 暂无答案