gpt4 book ai didi

java - 如何通过 CSVParser 处理大文件?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:52:37 54 4
gpt4 key购买 nike

我有一个很大的 .csv 文件(大约 300 MB),它是从远程主机读取的,并解析为目标文件,但我不需要将所有行复制到目标文件。复制时,我需要从源代码中读取每一行,如果它传递了一些谓词,则将该行添加到目标文件。

我想 Apache CSV ( apache.commons.csv ) 只能解析整个文件

CSVFormat csvFileFormat = CSVFormat.EXCEL.withHeader();
CSVParser csvFileParser = new CSVParser("filePath", csvFileFormat);
List<CSVRecord> csvRecords = csvFileParser.getRecords();

所以我不能使用 BufferedReader。根据我的代码,应该为每一行创建一个 new CSVParser() 实例,这看起来效率很低。

在上述情况下,我如何解析单行(具有已知表头)?

最佳答案

无论您做什么,文件中的所有数据都将传送到您的本地计算机,因为您的系统需要对其进行解析以确定有效性。无论文件是通过解析器读取的文件到达的(因此您可以解析每一行),还是只是将整个文件复制过来进行解析,它都会全部转到本地。您将需要在本地获取数据,然后修剪多余的数据。

调用 csvFileParser.getRecords() 已经是一场失败的战斗,因为 the documentation解释说该方法将文件的每一行加载到内存中。要在保存 Activity 内存的同时解析记录,您应该迭代每条记录;该文档暗示以下代码一次将一条记录加载到内存中:

CSVParser csvFileParser = CSVParser.parse(new File("filePath"), StandardCharsets.UTF_8, csvFileFormat);

for (CSVRecord csvRecord : csvFileParser) {
... // qualify the csvRecord; output qualified row to new file and flush as needed.
}

既然你解释了"filePath"不是本地的,那么上面的解决方案很容易因连接问题而失败。为了消除连接问题,我建议您将整个远程文件复制到本地,通过比较校验和确保文件复制准确,解析本地副本以创建目标文件,然后在完成后删除本地副本。

关于java - 如何通过 CSVParser 处理大文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32123969/

54 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com