从txt获取大数据并对它们进行排序

时间:2017-12-19 16:16:50

标签: c++

我正在尝试创建一个C ++项目,该项目从txt文件中获取文件名并计算它们并列出它的前10个列表。一小段输入如下所示:

local - - [24/Oct/1994:13:41:41 -0600] "GET index.html HTTP/1.0" 200 150   
local - - [24/Oct/1994:13:41:41 -0600] "GET 1.gif HTTP/1.0" 200 1210  
local - - [24/Oct/1994:13:43:13 -0600] "GET index.html HTTP/``1.0" 200 3185  
local - - [24/Oct/1994:13:43:14 -0600] "GET 2.gif HTTP/1.0" 200 2555         
local - - [24/Oct/1994:13:43:15 -0600] "GET 3.gif HTTP/1.0" 200 36403   
local - - [24/Oct/1994:13:43:17 -0600] "GET 4.gif HTTP/1.0" 200 441    
local - - [24/Oct/1994:13:46:45 -0600] "GET index.html HTTP/1.0" 200 31853

我正在尝试的代码如下:

#include <iostream>
#include <fstream>
#include <sstream>
#include <unordered_map>
#include <vector>
#include <iterator>
#include <algorithm>
#include <functional>


std::string get_file_name(const std::string& s) {
    std::size_t first = s.find_first_of("\"");
    std::size_t last = s.find_last_of("\"");

    std::string request = s.substr(first, first - last);

    std::size_t file_begin = request.find_first_of(' ');
    std::string truncated_request = request.substr(++file_begin);

    std::size_t file_end = truncated_request.find(' ');
    std::string file_name = truncated_request.substr(0, file_end);

    return file_name;
}



int main() {

    std::ifstream f_s("text.txt");
    std::string content;
    std::unordered_map<std::string,long int> file_access_counts;

    while (std::getline(f_s, content)) {
        auto file_name = get_file_name(content);
        auto item = file_access_counts.find(file_name);

        if (item != file_access_counts.end()) {
            ++file_access_counts.at(file_name);
        }
        else {
            file_access_counts.insert(std::make_pair(file_name, 1));
        }
    }

    f_s.close();

    std::ofstream ofs;
    ofs.open("all.txt", std::ofstream::out | std::ofstream::app);

    for (auto& n : file_access_counts)
        ofs << n.first << ", " << n.second << std::endl;

    std::ifstream file("all.txt");
    std::vector<std::string> rows;

    while (!file.eof())
    {
        std::string line;
        std::getline(file, line);
        rows.push_back(line);
    }

    std::sort(rows.begin(), rows.end());
    std::vector<std::string>::iterator iterator = rows.begin();
    for (; iterator != rows.end(); ++iterator)
        std::cout << *iterator << std::endl;

    getchar();


    return 0;
}

当我执行时,它会显示文件名和重复次数,但不是从最高到最低,我不认为它适用于大数据(如50000数据)。你能帮助我吗? 谢谢。

1 个答案:

答案 0 :(得分:1)

回读后,all.txt的内容正在排序。问题是计数位于行的末尾,因此只影响名称后的排序。

all.txt

3.gif, 1
index.html, 3
1.gif, 1
2.gif, 1
4.gif, 1
排序后的

rows向量:

1.gif, 1
2.gif, 1
3.gif, 1
4.gif, 1
index.html, 3

更改将值写入all.txt的方式,或在排序前解析计数。

如果你把计数放在行的开头,一定要用零填充,所以3在10之后。