C ++从CSV文件中读取一列数据

时间:2015-07-16 15:28:01

标签: c++ csv

编辑:在示例代码中,我最初声明我正在打印到控制台。这只是示例代码,用于引用我的文件i / o。我实际上将数据存储在稍后要使用的向量中。

所以我使用C ++的标准文件i / o来读取包含大约700万条记录的CSV文件。现在在8GB的PC上大约需要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 ++程序,它应该加快这个过程。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

在控制台上打印700万行是非常耗时的。不知道为什么要这样做。

您可以使用cout注释掉该行,并查看控制台打印速度有多快。

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

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

另一种方法是通过setvbuf增加C运行时库使用的缓冲区大小。您可以使用不同的尺寸来查看它是否有帮助。