Разбор файла с непостоянным форматом (количество значений) - PullRequest
1 голос
/ 19 февраля 2012

В настоящее время я пытаюсь проанализировать текстовый файл, сформатированный следующим образом:

 [value1(double),value2(double];[value1(double),value2(double];...;[value1(double),value2(double]\n
 [value1(double),value2(double];[value1(double),value2(double];...;[value1(double),value2(double]\n
 etc...

Этот файл является результатом измерений, выполненных датчиками: каждая скобка представляет интервал значений датчика, икаждая отдельная строка представляет собой меру.

Проблема в том, что мы иногда отключаем определенные датчики, чтобы файл не имел одинаковый формат, поэтому я действительно не знаю, как сделать «общий»синтаксический анализатор, который не должен учитывать количество включенных датчиков.

Конечно, я не знаю, ясно ли это, это число значений отличается от файла к другому.Я имею в виду, что в одном и том же файле число значений очевидно постоянное.Поэтому, если я отключу каждый датчик, кроме одного, у меня будет что-то вроде этого:

 [value1(double),value2(double]\n
 [value1(double),value2(double]\n
 etc...

Формат вывода будет таким:

LINE 1:
    x1min: ... (first value of the first bracket-couple)
    x1max: ... (second value of the second bracket-couple)
    x2min: ...
    x2max: ...
etc...

LINE 2:
    same here

ETC
enter code here

Некоторая помощь будет принята с благодарностью.

Хорошего дня, и большое спасибо.

PS: Очень извините за мой плохой английский

Ответы [ 3 ]

1 голос
/ 19 февраля 2012

Читать строку:

 [value1,value2];[value1,value2];[value1,value2];.........

Обработка строки:

Till the end of line is met do:
    For all chars from '[' to ']', read the 2 values.
    Store val1 and val2

Повторяйте это до конца файла.

0 голосов
/ 21 февраля 2012

Boost.Spirit предлагает полноценный инструмент разбора: вот код, который вы можете использовать и адаптировать к вашей конкретной проблеме:

#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/adapted/std_pair.hpp>

#include <vector>
#include <string>
#include <iostream>

namespace client
{
    using namespace std;

    typedef pair<string, double> t_named_num;
    typedef vector<t_named_num> t_named_numbers;
    typedef vector<t_named_numbers> t_records;

    namespace qi = boost::spirit::qi;

    template <typename Iterator>
    struct parse_records : qi::grammar<Iterator, t_records()>
    {
        parse_records() : parse_records::base_type(records)
        {
            name = qi::char_("a-zA-Z_") >> *qi::char_("a-zA-Z_0-9");
            named_num = name >> '(' >> qi::double_ >> ')'    ;
            named_numbers = '[' >> (named_num  % ',') >> ']' ;
            records = named_numbers % ';' ;
        }
        qi::rule<Iterator, string()> name;
        qi::rule<Iterator, t_named_num()> named_num;
        qi::rule<Iterator, t_named_numbers()> named_numbers;
        qi::rule<Iterator, t_records()> records;
    };
}
int main(int argc, char *argv[])
{
    using namespace std;
    using namespace client;

    string s("[a(1),b(2),c(3)];[u(31.5),v(32),z(-23)]");
    string::iterator i = s.begin(), e = s.end();
    parse_records<string::iterator> p;
    t_records c;
    if (boost::spirit::qi::parse(i, e, p, c))
    {
        for (t_records::iterator r = c.begin(); r != c.end(); ++r)
        {
            cout << "record" << endl;
            for (t_named_numbers::iterator n = r->begin(); n != r->end(); ++n)
                cout << n->first << ':' << n->second << endl;
        }
        if (i == e)
            cout << "ok" << endl;
        else
            cout << "ko" << endl;
    }
    else
        cout << "??" << endl;
}

Вывод программы:

record
a:1
b:2
c:3
record
u:31.5
v:32
z:-23
ok

Я должен сказать, что его нелегко использовать, но на самом деле он очень, очень мощный. НТН

0 голосов
/ 19 февраля 2012

Вы можете прочитать первую строку, посчитать количество открывающих скобок '[', а затем настроить парсер фиксированной длины из этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...