C ++ сортировать одинаковые IP вместе, веб-журнал - PullRequest
0 голосов
/ 19 ноября 2018

Мне нужно отсортировать файл веб-журнала по IP, поэтому мне нужно подключить те же IP-адреса под следующими.Я ленивый, но я хочу изучить способы в C ++, поэтому я не хочу сортировать его в Excel.Я сделал некоторые изменения в журнале, поэтому, например, после того, как IP в каждой строке равен (8 q [символов] {qqqqqqqq}), после этого идет другой адрес - так что я могу сортировать строки в строках по номерам для каждой строки, потому что IP не имеюттакой же длины - поэтому мне нужно дать только 16 символов в строке для массива и сравнить - по крайней мере, я подумал, что это будет хорошей идеей.

Пример журнала:

85.xx.xx.58 qqqqqqqq    85.xx.xx.58.xxxxxxxxx   bla,bla,bla,bla,
105.216.xx.xx   qqqqqqqq    - bla,bla,bla,bla,bla,bla,bla,
85.xx.xx.58 qqqqqqqq    85.xx.xx.58.xxxxxxxxx   bla,bla,bla,bla,

В журнале большечем 60 000 строк, и я использовал C ++ для стирания строк robot.txt, .js, .gif, .jpg и т. д., поэтому я хочу перезапустить старый код.пример для "robot.txt" delete-line.

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main()
{
ifstream infile("C:\\ips.txt");
ofstream myfile;
string line;

while (getline(infile, line)) {

    myfile.open("C:\\ipout.txt");

    for (string line; getline(infile, line); ) {
        if (line.find("robots.txt") != string::npos)
                myfile << line << "\n";
    }
}

infile.close();
myfile.close();

cout << " \n";
cin.get();

return 0;
}

Я знаю, что этот код выглядит ужасно, но он сделал свое дело, я все еще учусь, и, конечно, я хочу иметь старый файл и другойфайл (новый).

Я нашел помощь по этой теме, но это было для меня не по пути ...

Я подумываю об изменении оператора "если", чтобы он читал только 16 символов, сравните ихи соедините их (друг с другом, с линиями), конечно, вся линия должна быть неповрежденной - если это возможно.

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Спасибо за сообщение и код, это было полезно, и я узнал что-то новое. Вы правы, мое описание того, что я хотел, немного странно, но я позволил себе изменить ваш код для моих нужд. Так что для ppl, ищущих такое изменение веб-журнала, я поделюсь этим кодом.

#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <sstream>
#include <unordered_map>

using namespace std;

using logmap = std::unordered_map<std::string, std::vector<std::string>>;

logmap readlog(std::istream& is) {
logmap rv;
std::string line;
while (std::getline(is, line)) {
    // put the line in a stringstream to extract ip and the rest
    std::stringstream ss(line);
    std::string ip;
    std::string rest;
    ss >> ip >> std::ws;
    std::getline(ss, rest);
    // add your filtering here 
    // put the entry in the map using ip as key
    rv[ip].push_back(rest);
}
return rv;
}

int main() {

ifstream infile("C:\\ips.txt");
ofstream myfile;
myfile.open("C:\\ipout.txt");
long nr = 0;

logmap lm = readlog(infile);
for (const auto& m : lm) {
    nr++;
    for (const auto& l : m.second){
        myfile << nr << " " << m.first << " " << l << "\n";
    }
}
infile.close();
myfile.close();
std::cout << "Enter ! \n";
std::cin.get();

return 0;
}

Ввод (ips.txt) - файл веб-журнала:

1.2.3.4     qqqqqqqq    GET" line code, code,code,code,code,code,code,
5.6.7.8     qqqqqqqq    code,code,code,code,code,code,code,code,tygy
9.10.11.12  qqqqqqqq    all
1.2.3.4     qqqqqqqq    GET" line code, code,code,code,code,code,code,6fg
3.6.7.2     qqqqqqqq    GET" line code,
5.6.7.8     qqqqqqqq    code,code,code,code,code,code,code,code,s5
1.2.3.4     qqqqqqqq    GET" line code, code,code,code,code,code,code,
9.10.11.12  qqqqqqqq    all

Вывод кода (ipout.txt):

1 5.6.7.8 qqqqqqqq  code,code,code,code,code,code,code,code,tygy
1 5.6.7.8 qqqqqqqq  code,code,code,code,code,code,code,code,s5
2 1.2.3.4 qqqqqqqq  GET" line code, code,code,code,code,code,code,
2 1.2.3.4 qqqqqqqq  GET" line code, code,code,code,code,code,code,6fg
2 1.2.3.4 qqqqqqqq  GET" line code, code,code,code,code,code,code,
3 9.10.11.12 qqqqqqqq   all
3 9.10.11.12 qqqqqqqq   all
4 3.6.7.2 qqqqqqqq  GET" line code,

И мой первый код из 1. вопроса, может помочь вам удалить ненужные строки.

Итак, еще раз Спасибо, мой герой >> Тед Люнгмо <<, живи долго и процветай: -). </p>

0 голосов
/ 19 ноября 2018

Я не уверен, что действительно понял формат журнала, но, думаю, вы можете адаптировать его под свои нужды.

Это предполагает формат журнала на основе строки, где каждая строка начинается с ключа, по которому вы хотите сгруппировать данные (например, номер ip). Он использует unordered_map, но вы можете попробовать и обычный map. Ключом на карте является IP-номер, а остальная часть строки будет помещена в вектор строк.

#include <iostream>
#include <vector>
#include <sstream>
#include <unordered_map>

// alias for the map
using logmap = std::unordered_map<std::string, std::vector<std::string>>;

logmap readlog(std::istream& is) {
    logmap rv;
    std::string line;
    while(std::getline(is, line)) {
        // put the line in a stringstream to extract ip and the rest
        std::stringstream ss(line);
        std::string ip;
        std::string rest;
        ss >> ip >> std::ws;
        std::getline(ss, rest);
        // add your filtering here 
        // put the entry in the map using ip as key
        rv[ip].push_back(rest);
    }
    return rv;
}

int main() {
    logmap lm = readlog(std::cin);
    for(const auto& m : lm) {
        std::cout << m.first << "\n";
        for(const auto& l : m.second) {
            std::cout << " " << l << "\n";
        }
    }
}

С учетом этого ввода:

127.0.0.1 first ip first line
192.168.0.1 first line of second ip
127.0.0.1 this is the second for the first ip
192.168.0.1 second line of second ip
127.0.0.1 and here's the third for the first
192.168.0.1 third line of second ip

Это возможный вывод:

192.168.0.1
 first line of second ip
 second line of second ip
 third line of second ip
127.0.0.1
 first ip first line
 this is the second for the first ip
 and here's the third for the first
...