从CSV文件中读取一列数据

C++ Reading a column of data from a CSV file

本文关键字:一列 数据 CSV 文件 读取      更新时间:2023-10-16

编辑:在示例代码中,我最初声明我要打印到控制台。这只是示例代码,用于参考我如何执行文件I/o。我实际上是将数据存储在一个稍后会用到的向量中。

所以我使用c++的标准文件I/o来读取这个包含大约700万条记录的CSV文件。现在在8gb的电脑上需要大约80秒,但是我想加快这个时间。

 string line;
 ifstream myfile ("example.csv");
 if (myfile.is_open())
 {
   while ( getline (myfile,line) )
   {
     //cout << line << 'n'; -- edit. Not printing out to console but      
                                      storing to an array
   }
  myfile.close();
 }

由于CSV文件只有一个列,是否有一种方法来快速抓取所有的数据,而不是通过一行一行?

我的理解是从文件到程序的传输是需要最长时间的,所以我想如果我可以将文件中的所有数据存储在某个地方(不确定这个过程),然后立即将其全部写入c++程序,它应该会加快这一过程。

getline已经将在文件流上调用基于块的缓冲读取,并且您的操作系统将通过预缓存进一步优化该访问模式。(见鬼,你的硬盘可能会变得很聪明。)您的程序花费这么长时间并不奇怪,但这是因为控制台输出比文件输入慢得多(主要是因为需要在之后进行大量字体渲染)。在尝试优化IO之前,先实现想要对文件执行的实际处理[并取出控制台输出],然后看看它有多快。

在控制台打印700万行非常耗时。我不知道你为什么要那样做。

您可以用cout注释掉这行,看看控制台打印的速度有多快。

读取大量顺序数据并不是使用缓冲I/O的最佳选择,因为数据被复制了两次(或更多次):
磁盘->缓冲区->程序

您可以通过打开/读取/关闭C函数(#include <io.h>)使用非缓冲I/O。这就不太适合文本处理了。

另一种选择是通过setvbuf增加C运行时库使用的缓冲区大小。你可以尝试不同的大小,看看是否有帮助。