Russian Qt Forum
Ноябрь 24, 2024, 05:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3] 4 5   Вниз
  Печать  
Автор Тема: Парсинг строк  (Прочитано 32379 раз)
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #30 : Март 15, 2016, 17:14 »

m_ax, почитал про grammar, пока что не осилить. #22 тоже плохо понимаю, но посыл ясен.
А сработает ли ваш подход если список узлов находится в середине файла и обозначен "BEGIN NODE" "END NODE"?
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #31 : Март 15, 2016, 17:22 »

Цитировать
m_ax, почитал про grammar, пока что не осилить. #22 тоже плохо понимаю, но посыл ясен.
Да это фактически тот же самый код, только оформленный в отдельный парсер (как qi::float_ и т.д.).

Цитировать
А сработает ли ваш подход если список узлов находится в середине файла и обозначен "BEGIN NODE" "END NODE"?
Конечно)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #32 : Март 17, 2016, 15:30 »

А какой объем распознаваемого текста? на мегабайтных файлах ручками получается в несколько раз быстрее.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #33 : Март 17, 2016, 15:32 »

Объём 200-600мб
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #34 : Март 17, 2016, 16:02 »

>>*node(363484,232.7625,-113.996,40.69956,0,0,0,0,0) - здесь первая цифра - номер узла, три следующие - его координаты.
тут 9 цифр, я наверно сделал бы так:
найти позицию скобок и запятых, потом блоки текста копировать в распознаватель QString::toDouble(). Или ручками код накидать.
Если на время наплевать, то регулярками конечно красивее.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #35 : Март 17, 2016, 16:08 »

Я это же и сделал в #13.
С регулярками у меня всё очень плохо. Подобных парсеров надо штук 10 сделать. Пока держусь за идею со спиритом. Правда пока нет времени изучать, поэтому временно пользуюсь кодом из #13.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #36 : Март 17, 2016, 16:17 »

А какой объем распознаваемого текста? на мегабайтных файлах ручками получается в несколько раз быстрее.
Спирит будет быстрее всяких "ручек") Не говоря уже о гибкости) 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #37 : Март 17, 2016, 16:26 »

А по времени сколько распознается? На регулярках и вашим кодом?

У вас все выражения в стиле "число(число,число,число,число,число,число,число,число)", или по сложнее что есть?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #38 : Март 17, 2016, 16:56 »

Я регулярные не пробовал. Не знаю, как ими пользоваться. Быть может позже, интереса ради, приведу замеры спирит / регулярки / руки (мои).
Строки однотипные.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #39 : Март 18, 2016, 06:58 »

Код
C++ (Qt)
template <typename Iterator>
bool parse_hypermesh(Iterator first, Iterator last, Node& node)
{
   return qi::phrase_parse(first, last,
       (
           qi::lit("*node(") >> qi::uint_[phx::ref(node.number) = _1] >> ','
           >> qi::float_[phx::ref(node.coordinates[0]) = _1] >> ','
           >> qi::float_[phx::ref(node.coordinates[1]) = _1] >> ','
           >> qi::float_[phx::ref(node.coordinates[2]) = _1] >> ','
           >> *(qi::uint_ >> ',')
           >> qi::uint_ >> ')'
       ),
       sw::space) && first == last;
}
 
Зная задачу понять текст несложно. qi::float_ - читаем флот, для даблов наверное qi::double_. Правда дальше идет капитальное страхомудие с ref и _1. Это _1 я мельком видел в std, смутно помню, мол, первый аргумент (типа "слот"). Ну ладно, "это работает", когда надо - найти пример и скопи-пастить, через неск раз  запомнится. С  sw::space тоже ясно - пропускать альфы.

Как-то развить пример я не могу. Напр как выйти при обнаружении "дальше примечания" (//)? Придется надыбать примерчик и опять передрать. Какое-то ветвление в разборе - то же самое.

В общем выходит что я должен тупо и много зубрить, просто запоминать (талант которого я никогда не имел Улыбающийся). Собственно это нормально, любая вещь требует какого-то запоминания базовых основ, без этого не обойтись. Вероятно переписав пяток-десяток примеров я смогу делать и более сложные вещи (несмотря на весь мудизм синтаксиса в бусте всегда есть смысл).

Ну и так ли уж это хорошо/здорово ?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #40 : Март 18, 2016, 07:21 »

В общем выходит что я должен тупо и много зубрить, просто запоминать (талант которого я никогда не имел Улыбающийся).
Поэтому, смогли зазубрить только как работать с QString, у других с этим может быть получше. Поэтому, для решения аналогичных задач, вам приходится написать несколько сот строк, а другим несколько десятков. А так да, разницы нет.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #41 : Март 18, 2016, 07:49 »

капитальное страхомудие

не устану приводить этот кусочек кода Веселый
Цитировать
Код
C++ (Qt)
       switch (e->type()) {
           case QEvent::MouseButtonDblClick:
               break;
           default:
               return false;
       }
 

Да уж понятнее, что требуется от парсера, чем если делать то же самое в QString используя проверки, тримы.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #42 : Март 18, 2016, 08:07 »

Поэтому, для решения аналогичных задач, вам приходится написать несколько сот строк, а другим несколько десятков.
Даже если "несколько сот" и наберется - я напишу их один раз. И это будет не операторная срань, а ф-ции с нормальными именами понятными каждому без всякой подготовки (ReadInt, ReadFloat и др). А на этапе использования мой код ничуть не длиннее. Кстати за Вами контроль ошибок

И вообще позвольте спросить, почему что-то типа этого
Код
C++ (Qt)
>> qi::float_[phx::ref(node.coordinates[0]) = _1] >> ','
считается шедевром инженерной мысли? Чем мотивировано такая оценка (кроме банального "это делали умные люди")? Почему этой херней непременно нужно владеть, это типа "класс программиста" и, якобы, показатель его грамотности? А может это всего лишь один из возможных стилей - или вообще, тупиковая ветка эволюции?

...чем если делать то же самое в QString используя проверки, тримы.
Так может Вы просто не умеете это делать в QString ? Улыбающийся Или вообще не умеете выделить ф-ции, построить алгоритм, а хотите только "пользоваться готовым"?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #43 : Март 18, 2016, 08:14 »

И вообще позвольте спросить, почему что-то типа этого
Код
C++ (Qt)
>> qi::float_[phx::ref(node.coordinates[0]) = _1] >> ','
считается шедевром инженерной мысли? Чем мотивировано такая оценка (кроме банального "это делали умные люди")? Почему этой херней непременно нужно владеть, это типа "класс программиста" и, якобы, показатель его грамотности?
А откуда вы это взяли? Вас кто-то принуждает это использовать и этим владеть?

А может это всего лишь один из возможных стилей - или вообще, тупиковая ветка эволюции?
Может. Легко.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #44 : Март 18, 2016, 08:20 »

не устану приводить этот кусочек кода Веселый
Цитировать
Код
C++ (Qt)
       switch (e->type()) {
           case QEvent::MouseButtonDblClick:
               break;
           default:
               return false;
       }
 
А чего тут хихикать? Появится второе фильтруемое событие - и так написать все равно придется
Записан
Страниц: 1 2 [3] 4 5   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.197 секунд. Запросов: 23.