Всем добрый день.
Мне нужно отсортировать файл веб-журнала по 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 символов, сравнить их и соединить их (друг с другом, со строками), конечно, вся строка должна быть в такте — если это возможно …
Спасибо за любой ответ, и будьте терпеливы со мной, никто не совершенен … 🙂
Я не уверен, что действительно понял формат журнала, но, думаю, вы можете адаптировать его под свои нужды.
Это предполагает формат журнала на основе строки, где каждая строка начинается с ключа, по которому вы хотите сгруппировать данные (например, номер 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
Спасибо за пост и код, это было полезно, и я узнал новые вещи. Вы правы, мое описание того, что я хотел, немного странно, но я позволил себе изменить ваш код для моих нужд. Так что для 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. вопроса, может помочь вам удалить ненужные строки.
Итак, еще раз Спасибо, мой герой >> Тед Люнгмо <<, живи долго и процветай :-).