读取/排序大型.CSV文件

时间:2016-02-16 02:51:43

标签: c++ csv bucket

所以从概念上讲,我正在阅读一个包含大约200万行数据的文件。我希望以后对数据进行排序,存储和应用。

  1. 我被告知这被称为“桶”,但我不清楚这是预先定义的还是用户定义的数据类型。所以我很好奇链接列表或数组或其他组合是否可取?

  2. 我是否需要担心文件的大小?大多数编译器是否能够同时处理这一切,或者我是否需要首先对数据进行分区(即分成每个桶,存储在自己的文件中,然后使用其他代码等)?

  3. 如果需要#2,C ++是否具有每次执行保存多个文件的功能?含义a)创建bucket1 file.txt; b)填充bucket1文件;关闭bucket1文件; d)创建bucket2文件; ...

1 个答案:

答案 0 :(得分:0)

好的,所以我从你的帖子中收集你用C ++写的。但是,除了排序要求之外,细节有点稀疏。但你还在整理什么?所有字段都被解释为文本吗?有些数字吗?有多个钥匙吗?

如果你不是绝对需要用C ++写这个,并且你在Linux上,只需调用/ bin / sort来进行排序。这可能看起来像是一个警察,但像Talend这样的商业软件甚至会采用这种方法。

但是如果你必须用C ++编写新代码,这些是我的建议:

1)CSV文件是否已转义?换句话说,嵌入式引号和分隔符是否需要特殊处理?你必须先弄清楚这一点。

2)检查出来:http://mybyteofcode.blogspot.com/2010/02/parse-csv-file-with-boost-tokenizer-in.html

3)扫描输入的简单表示是vector<vector<string> >。但它很笨重。相反,在vector<string>周围包装一个类,并创建一个指向这些类的指针的向量,每行输入一个,然后对它们进行排序。

4)这些天你应该可以在内存中排序~2M“中”行。只需使用std :: sort。但是为了完全普遍,你需要考虑一下,如果它不适合内存呢?最常见的答案是一次对块进行排序,将结果写入磁盘,然后使用优先级队列或类似结构将其合并。