Advertisement
Queen4

Parsing logs IND 0.1

Dec 15th, 2019
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.35 KB | None | 0 0
  1. #include <iostream>
  2. #include <regex>
  3. #include <vector>
  4. #include <iterator>
  5. #include <string>
  6. #include <utility>
  7. #include <algorithm>
  8. #include <functional>
  9. #include <numeric>
  10. #include <fstream>
  11.  
  12. using namespace std;
  13.  
  14. const regex re{ R"(\$(.*)\*[abcdefABCDEF\d]{2})" };
  15. const regex delimiter{ "," };
  16. using Tokens = vector<string>;
  17.  
  18.  
  19. tuple<bool, Tokens> checkString(const string& str) {
  20.  
  21.     // Возвращает значение функции. Предположим, что строка не подходящая
  22.     tuple<bool, vector<string>> result(false, {});
  23.  
  24.     // Мы хотим найти строку в заданном формате
  25.     smatch sm{};
  26.     if (regex_match(str, sm, re)) {
  27.  
  28.         // Хорошо, нашел. Проверка контрольной суммы
  29.         if (string s = sm[1];stoul(str.substr(str.size() - 2), nullptr, 16) == accumulate(s.begin(), s.end(), 0U, bit_xor<unsigned char>())) {
  30.  
  31.             // Tokenize string
  32.             Tokens tokens(sregex_token_iterator(str.begin(), str.end(), delimiter, -1), {});
  33.             // Построить возвращаемое значение
  34.             result = make_tuple(true, move(tokens));
  35.         }
  36.     }
  37.     return result;
  38. }
  39.  
  40. int main() {
  41.  
  42.     vector<Tokens> csvData{};
  43.  
  44.     // Откройте файл и проверьте, открыт ли он.
  45.     if (ifstream logs("r:\\LogGLO.txt"); logs) {
  46.  
  47.         // Будем ли мы обрабатывать текстовые строки или нет
  48.         bool processingActive{ false };
  49.  
  50.         // Читаем все строки файла
  51.         for (string line{}; getline(logs, line);) {
  52.  
  53.             // Проверяем нужно ли продолжать
  54.             if (line.substr(0, 9) == string("RE004%on%")) processingActive = true;
  55.             if (line.substr(0, 10) == string("RE005%off%")) processingActive = false;
  56.  
  57.             // Проверяем и читает csv data
  58.             if (processingActive) {
  59.                 const auto [ok, data] = checkString(line);
  60.                 if (ok) csvData.push_back(move(data));
  61.             }
  62.  
  63.         }
  64.     }
  65.  
  66.     // So, now we have read all csv data
  67.     // Show eight column of GPGSV data
  68.     for (const Tokens& t : csvData)
  69.         if (t[0] == "$GPGSV")
  70.             cout << t[7] << "\n";
  71.  
  72.     return 0;
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement