我的目标是在OSX环境中的QT项目中使用C++解析大型csv文件。(当我说csv时,我指的是tsv和其他变体1GB ~ 5GB)。
这似乎是一项简单的任务,但当文件大小变得更大时情况变得复杂。由于与解析csv文件相关的许多边缘情况,我不想编写自己的解析器。
我已经找到了各种csv处理库来处理此工作,但在我的机器上解析1GB文件大约需要90-120秒,这是不能接受的。现在我仅处理并丢弃数据进行测试。
cccsvparser是我尝试过的库之一。但唯一足够快的库是fast-cpp-csv-parser,它可以在我的机器上以15秒的速度给出可接受的结果,但只有在已知文件结构时才能工作。
示例使用:fast-cpp-csv-parser
#include "csv.h"
int main(){
io::CSVReader<3> in("ram.csv");
in.read_header(io::ignore_extra_column, "vendor", "size", "speed");
std::string vendor; int size; double speed;
while(in.read_row(vendor, size, speed)){
// do stuff with the data
}
}
正如您所看到的,我无法加载任意文件,必须明确定义变量以匹配我的文件结构。我不知道是否有任何方法可以让我在运行时动态创建这些变量。
我尝试过的另一种方法是使用fast-cpp-csv-parser LineReader类逐行读取csv文件(速度非常快,约为7秒),然后使用cccsvparser库解析每行字符串,但这需要大约40秒才能完成,虽然相比第一次尝试有所改进,但仍然无法接受。
我看过各种与csv文件解析相关的Stack Overflow问题,但没有一个考虑到大文件处理。
此外,我花了很多时间搜索解决此问题的方法,我真的很想念像npm或pip这样的软件包管理器在搜索现成解决方案时提供的自由。
我将感谢任何关于如何处理此问题的建议。
编辑:
使用@fbucek的方法,处理时间缩短至25秒,这是一个巨大的改进。
我们能否进一步优化?