Advertisement
Queen4

Parsing logs

Jan 21st, 2020
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.80 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <unordered_set>
  5. #include <array>
  6. #include <map>
  7.  
  8. // Переменные для поиска времени
  9. struct MainTime {
  10.     int hour = 0;
  11.     int nexthour = 0;
  12.     int minute = 0;
  13.     int nextminute = 0;
  14.     float sec = 0.0;
  15.     float nextsec = 0.0;
  16.     float sum = 0.0;
  17.     float SNRs = 0.0;
  18. };
  19.  
  20. // Cкладывает по принципу XOR
  21. int XOR(const char* s) {
  22.     int c = 0;
  23.  
  24.     while (*s)
  25.         c ^= *s++;
  26.  
  27.     return c;
  28. }
  29.  
  30. // Класс с переменными для поиска среднего времени
  31. class FindingATime {
  32. public:
  33.     int count = 0;
  34.     float Atime = 0.0;
  35. };
  36.  
  37. // Перегрузка оператора для вывода среднего времени
  38. std::ostream& operator<< (std::ostream& out, const FindingATime& point)
  39. {
  40.     out << " Average time: " << point.Atime;
  41.     return out;
  42. }
  43.  
  44.  
  45. int main() {
  46.     int comma, key; // Переменная для подсчета запятых и проверки контрольной суммы
  47.     MainTime time; //Структура времени
  48.     FindingATime find_time;
  49.     // Переменные для работы со строками
  50.     char linec_h[200];
  51.     std::string line, key_s;
  52.     // Работа с ведром номеров спутника
  53.     std::unordered_set<std::string> Set; //сет номеров спутника
  54.     std::string SatelliteNumber;
  55.     // Работа со среднем значением времени к каждому SNR
  56.     int SNRnumber;
  57.     std::map <int, FindingATime> Map;
  58.  
  59.     std::ifstream logs_("C:/Users/Ivan/Desktop/Logs.txt"); // Откуда берем данные
  60.     std::ofstream pout("C:/Users/Ivan/Desktop/SNR.txt"); // Куда загружаем данные о спутниках
  61.     std::ofstream tout("C:/Users/Ivan/Desktop/Avarage Time.txt"); // Куда загружаем данные о среднем времени
  62.  
  63.     if (logs_.is_open()) {
  64.         while (getline(logs_, line)) {
  65.  
  66.             if (line.substr(0, 10) == "RE005%off%") {
  67.                 pout << "End of cycle" << std::endl;
  68.             }
  69.             else if (line.substr(0, 9) == "RE004%on%") { // Если строка с включением, то
  70.                 pout << "Time of work: " << time.nexthour + time.nextminute + time.nextsec << " sec" << std::endl; // Выводим время работы цикла
  71.                 // Обнуляем переменные времени
  72.                 time.hour = 0;
  73.                 time.minute = 0;
  74.                 time.sec = 0.0;
  75.                 time.nexthour = 0;
  76.                 time.nextminute = 0;
  77.                 time.nextsec = 0.0;
  78.                 // Очищаем сет
  79.                 Set.clear();
  80.             }
  81.             else {
  82.                 //Проверяем контрольную сумму
  83.                 key_s = line.substr(line.length() - 2, 2);
  84.                 key = strtol(key_s.c_str(), nullptr, 16);
  85.                 line = line.substr(1, line.length() - 4);
  86.  
  87.                 strcpy_s(linec_h, line.c_str());
  88.                 if (line != "E00" && key != XOR(linec_h)) pout << "Line is corrupted!" << std::endl;
  89.                 else { //Если выполняется, то
  90.                     comma = 0;
  91.                     // Находим время, переводим в секунды, находим отношение первого значения и всех следующих
  92.                     if (line.substr(0, 5) == "GPGGA") {
  93.                         if (time.hour == 0 && time.minute == 0 && time.sec == 0.0) {
  94.                             time.hour = stoi(line.substr(6, 2)) * 3600;
  95.                             time.minute = stoi(line.substr(8, 2)) * 60;
  96.                             time.sec = stof(line.substr(10, 4));
  97.                         }
  98.                         else {
  99.                             time.nexthour = stoi(line.substr(6, 2)) * 3600 - time.hour;
  100.                             time.nextminute = stoi(line.substr(8, 2)) * 60 - time.minute;
  101.                             time.nextsec = stof(line.substr(10, 4)) - time.sec;
  102.                         }
  103.                         time.sum = time.nexthour + time.nextminute + time.nextsec;
  104.                     }
  105.                     // Если строка GPGSV
  106.                     else if (line.substr(0, 5) == "GPGSV") {
  107.                         // Проходимся по строке
  108.                         for (size_t i = 0, N = 4, SNR = 7; i < line.size(); i++) {
  109.                             // Считаем количество запятых
  110.                             if (line[i] == ',') comma++;
  111.                             // При нахождении нужного количества
  112.                             if (comma == N) {
  113.                                 SatelliteNumber = line.substr(i - 1, 2);
  114.                             }
  115.                             else if (comma == SNR) {
  116.                                 if (Set.find(SatelliteNumber) == Set.end()) { // Если значение встречается в первый раз, то
  117.                                     SNRnumber = stoi(line.substr(i + 1, 2));
  118.  
  119.                                     if (Map.find(SNRnumber) == Map.end()) { // Если номера нет в map
  120.                                         find_time.count++;
  121.                                         find_time.Atime = time.sum; // Присваиваем текущее значение времени в переменную среднего времени
  122.                                         Map.insert(std::pair<int, FindingATime>(SNRnumber, find_time)); //Добавляем их в map                                       
  123.                                     }
  124.                                     else {  // Иначе считаем среднее время                         
  125.                                         find_time.Atime *= find_time.count;
  126.                                         find_time.Atime += time.sum;
  127.                                         find_time.count++;
  128.                                         find_time.Atime /= find_time.count;                            
  129.                                         Map.at(SNRnumber) = find_time; // Добавляем его к номеру
  130.                                     }
  131.                                     // Выводим значения
  132.                                     pout << "Satellite name: " << SatelliteNumber << "  " << "SNR: " << SNRnumber << "  Elapsed time : " << time.sum << " sec" << std::endl;
  133.                                     Set.insert(SatelliteNumber); // Добавляем его в сет
  134.                                 }
  135.                                 // Идем дальше по строке
  136.                                 N += 4;
  137.                                 SNR += 4;
  138.                             }
  139.                         }
  140.                     }
  141.                 }
  142.             }
  143.         }
  144.         logs_.close();
  145.         // Выводим содержимое map
  146.         for (auto & it : Map) {
  147.             tout << "SNR:  " << it.first << it.second << " sec" << std::endl;
  148.         }
  149.         std::cout << "Success" << std::endl;
  150.     }
  151.     else std::cout << "File is not open" << std::endl;
  152.     pout.close();
  153.     tout.close();
  154.  
  155.     return 0;
  156. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement