сортировка — c ++ сортировка того же самого IP-адреса, веб-журнал

Всем добрый день.

Мне нужно отсортировать файл веб-журнала по 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».

#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 символов, сравнить их и соединить их (друг с другом, со строками), конечно, вся строка должна быть в такте — если это возможно …

Спасибо за любой ответ, и будьте терпеливы со мной, никто не совершенен … 🙂

0

Решение

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

Это предполагает формат журнала на основе строки, где каждая строка начинается с ключа, по которому вы хотите сгруппировать данные (например, номер 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
0

Другие решения

Спасибо за пост и код, это было полезно, и я узнал новые вещи. Вы правы, мое описание того, что я хотел, немного странно, но я позволил себе изменить ваш код для моих нужд. Так что для 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;
}

Input (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. вопроса, может помочь вам удалить ненужные строки.

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

0

По вопросам рекламы [email protected]