2016-02-16 53 views
1

所以在概念上,我正在读取一个包含大约200万行数据的文件。我期待在后面对数据进行排序,存储和应用其他功能。读取/排序一个大的.CSV文件

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

  2. 我需要担心文件的大小吗?大多数编译器能够同时处理所有这些问题,还是需要先分割数据(即分成每个桶,存储在自己的文件中,然后使用另一个代码等)?

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

回答

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。但是为了完整的概括性,你需要考虑,如果它不适合记忆呢?对此最常见的答案是一次对块进行排序,将结果写入磁盘,然后使用优先级队列或类似结构合并它们。

+0

文件示例: “1055,1055,1042,3006,3072,3031,3342,236” 我想存储第7个定义的存储桶中的前6个值。没有明显的限制,第6,7时隙似乎在0和450之间。 除逗号和eol外,没有特殊字符或分隔符。 谢谢你的链接和其他指针。 – Jarrell