【问题标题】:Read/Sort a large .CSV File读取/排序大型 .CSV 文件
【发布时间】:2016-02-16 02:51:43
【问题描述】:

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

  1. 有人告诉我这被称为“桶”,但我不清楚这是预定义的数据类型还是用户定义的数据类型。所以我很好奇是否建议使用链表或数组或其他组合?

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

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

【问题讨论】:

    标签: c++ csv bucket


    【解决方案1】:

    好的,所以我从您的帖子中得知您是用 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。但是为了全面概括,您需要考虑,如果它不适合内存怎么办?对此最常见的答案是一次对块进行排序,将结果写入磁盘,然后使用优先级队列或类似结构将其全部合并。

    【讨论】:

    • 文件示例:"1055,1055,1042,3006,3072,3031,3342,236" 我想将前 6 个值存储在第 7 个定义的存储桶中。前 6、7 个插槽似乎没有明显的限制,介于 0 到 450 之间。除了逗号和 eol 之外,没有特殊字符或分隔符。感谢您提供链接和其他指针。
    猜你喜欢
    • 1970-01-01
    • 2016-04-26
    • 2021-09-02
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多