使用Java处理大型CSV文件的有效方法

时间:2019-03-18 07:29:09

标签: java csv

让我们考虑一个场景

  1. Accounts.csv
  2. Transaction.csv

我们将每个帐号都映射到交易明细,因此1个帐号可以进行多个交易。使用这些详细信息,我们必须为每个帐户生成PDF

如果假设事务CSV文件很大(> 1 GB),则加载所有详细信息并进行解析可能是内存问题。那么解析事务文件的最佳方法是什么?逐块读取也导致内存消耗。请指教

3 个答案:

答案 0 :(得分:1)

正如其他人所说,数据库将是一个很好的解决方案。

或者,您也可以在帐号上对2个文件进行排序。大多数操作系统都提供有效的文件排序程序,例如用于Linux(在第5列上排序)

LC_ALL=C sort -t, -k5 file.csv > sorted.csv

取自Sorting csv file by 5th column using bash

然后您可以依次读取2个文件

您的编程逻辑是:

if (Accounts.accountNumber < Transaction.accountNumber) {
    read Accounts file
} else if (Accounts.accountNumber = Transaction.accountNumber) {
    process transaction
    read Transaction file
} else {
    read Transaction file
}

存储需求将为微小,您只需要保留内存中每个文件的一个记录

答案 1 :(得分:0)

假设您正在使用Oracle作为数据库。 您可以使用Oracle SQL Loader工具将数据加载到其相应的表中。

一旦加载了数据,您就可以使用简单的SQL查询从已加载的表中联接和查询数据。

这将适用于所有类型的数据库,但是您将需要找到合适的工具来加载数据。

答案 2 :(得分:0)

首先将数据导入数据库是最优雅的方法。 除此之外,您的问题还给人留下了这样的印象:

因此,我建议您逐行读取transaction.csv(例如,使用BufferedReader)。因为采用CSV格式,每一行都是一条记录,所以您可以(在阅读时)过滤掉并忘记每条不是您当前帐户的记录。 一次文件遍历后,您拥有一个帐户的所有交易记录,通常应该将其放入内存中。 这种方法的缺点是,您最终要多次读取事务,对于每个帐户PDF生成一次。但是,如果您的应用程序需要高度优化,我建议您已经使用了数据库。