Для нового формата журнала теперь можно было бы включить одну или несколько строк данных после равного символа, как в 2025-06-06 09: 33: 36,163154]-0,06-06 09: 33: 36, 1; 250,9; A0127FC3844DF400115406C800011806C031A0000; 2; 253,9; A0027FC384DF40010C8092A041FF83FFF; 3; 449.9; A1027FC38F361210BF080007DF; P> CODES> /> Я должен обновить следующий код, чтобы соблюдать этот новый запрос на несколько данных на линию, но я не могу сделать это после того, как попробовал несколько комбинаций и синтаксического анализатора: < /p>
Код: Выделить всё
#include
#include
namespace structs {
struct Message
{
unsigned id;
double position;
std::string hex;
};
using Messages = std::vector;
}
namespace qi = boost::spirit::qi;
namespace parser {
class log
{
using It = boost::spirit::istream_iterator;
public:
log()
{
using namespace qi;
using namespace structs;
using boost::phoenix::push_back;
tcl = (omit[raw[*~char_('>')]] >> '>'
>> "insert ="
>> uint_ >> ';' >> double_ >> ';' >> lexeme[raw[+xdigit]] >> ';')[fill(_1, _2, _3, _val)];
ignore = *~char_("\r\n");
start = skip(blank)[(tcl[push_back(_val, _1)] | ignore) % eol];
}
structs::Messages read(const std::string& file)
{
structs::Messages messages;
std::stringstream in{ file };
//std::ifstream in(ss, std::ios_base::in);
in >> std::noskipws;//No white space skipping
auto ok = qi::parse(boost::spirit::istream_iterator{ in }, boost::spirit::istream_iterator{}, start, messages);
return ok ? messages : structs::Messages{};
}
private:
struct deferred_fill
{
void operator() (unsigned id, double position, boost::iterator_range const& tlg, structs::Message& message) const
{
message.id = id;
message.position = position;
message.hex.assign(tlg.begin(), tlg.end());
}
};
qi::rule ignore;
qi::rule start;
qi::rule tcl;
boost::phoenix::function fill;
};
}
auto file1{
R"([2025-06-06 09:33:30.002155] - 0.000 s => begins to load XML file
[2025-06-06 09:33:30.250151] - 0.000 s => Received -> id: 1
[2025-06-06 09:33:30.253154] - 0.000 s => End initial Mnemonics
[2025-06-06 09:33:36.163154] - 0.020 s => insert = 1;250.9;A0127FC384DF400115406C800011806C031A0000;
[2025-06-06 09:33:36.164151] - 0.020 s => Received -> id: 2
[2025-06-06 09:35:05.444160] - 89.360 s => insert = 7;1655.9;A0027FC384E240010C8092A041FF83FFF;
[2025-06-06 09:33:36.164151] - 0.020 s => Received -> element_id: 1 connection_id: command: free
[2025-06-06 09:35:54.648162] - 138.560 s => insert = 9;2258.9;A002054384E3C0010C8092A041;
[2025-06-06 09:36:07.028155] - 150.940 s => Received -> Value: 1)" };
auto file2{
R"([2025-06-06 09:33:30.002155] - 0.000 s => begins to load XML file
[2025-06-06 09:33:30.250151] - 0.000 s => Received -> id: 1
[2025-06-06 09:33:30.253154] - 0.000 s => End initial Mnemonics
[2025-06-06 09:33:36.163154] - 0.020 s => insert = 1;250.9;A0127FC384DF400115406C800011806C031A0000;2;253.9;A0027FC384DF40010C8092A041FF83FFF;3;449.9;A1027FC38F361210BF080007DF;
[2025-06-06 09:33:36.164151] - 0.020 s => Received -> id: 2
[2025-06-06 09:35:05.444160] - 89.360 s => insert = 7;1655.9;A0027FC384E240010C8092A041FF83FFF;
[2025-06-06 09:33:36.164151] - 0.020 s => Received -> element_id: 1 connection_id: command: free
[2025-06-06 09:35:54.648162] - 138.560 s => insert = 9;2258.9;A002054384E3C0010C8092A041;10;2261.9;A0127FC384E3C00115412C80008B1007F4;
[2025-06-06 09:36:07.028155] - 150.940 s => Received -> Value: 1)" };
int main()
{
parser::log log;
auto messages1 = log.read(file1);
if (messages1.size() != 3) return 1;// Error parsing!!!
auto messages2 = log.read(file2);
if (messages2.size() != 6) return 1;// Error parsing!!!
return 0;
}
>
Подробнее здесь: https://stackoverflow.com/questions/796 ... rit-parser