Russian Qt Forum
Ноябрь 23, 2024, 10:37
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
Парсинг строки определенного типа
Страниц:
1
2
[
3
]
4
5
...
8
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Парсинг строки определенного типа (Прочитано 48641 раз)
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Парсинг строки определенного типа
«
Ответ #30 :
Май 05, 2014, 16:08 »
Цитата: Old от Май 05, 2014, 15:47
Эти умозаключения вы выдаете потому, что понятия не имеете о регулярках. Да?
Ну чего Вы такой "нервный и желчный субъект" (как писали классики)? Не стоит отвечать сразу полагая что "все ясно, он НЕ ЗНАЕТ
". Поверьте, есть люди которые пытаются думать и анализировать, и это нормально
Цитата: Old от Май 05, 2014, 15:47
Вспомните тему про парсер BibTex.
А что собственно я должен вспоминать?
Что я предложил нормальный код на C++ решающий задачу и доступный для дальнейшей поддержки и развития любому нормальному программисту? Так здесь мне стыдиться нечего
Записан
k0p4
Гость
Re: Парсинг строки определенного типа
«
Ответ #31 :
Май 05, 2014, 16:10 »
Цитировать
Во всех этих случаях Вам придется немало посуетиться с гордым/крутым "решением в 1 строку" и оно станет не таким уж простым. В то же время тупенький разбор "слово за словом" выдержит эту нагрузку без проблем.
Разбор "слово за словом" при новых условиях придётся модифаить. Как и регексп. Как и фаинд. А изменения не станут проблемой, в принципе, ни в одном из случаев.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Парсинг строки определенного типа
«
Ответ #32 :
Май 05, 2014, 16:12 »
Цитата: Igors от Май 05, 2014, 16:08
Ну чего Вы такой "нервный и желчный субъект" (как писали классики)?
А почему вы все время думаете что я нервно исхожу желчью?
Вы пишите очень наивные вещи, которые пугают исключительно вас. Это выглядит очень наивно, поэтому я и спросил.
Цитата: Old от Май 05, 2014, 15:47
А что собственно я должен вспоминать?
Что я предложил нормальный код на C++ решающий задачу и доступный для дальнейшей поддержки и развития любому нормальному программисту? Так здесь мне стыдиться нечего
Не, просто вы сразу поставили кучу условий и потребовали синтетические тесты на одном файле, которые кстати не прошли.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Парсинг строки определенного типа
«
Ответ #33 :
Май 05, 2014, 16:19 »
Цитата: k0p4 от Май 05, 2014, 16:04
ПС. Если кто-то заметил ошибки в коде, пожалуйста, сообщите. Я поправлю и проведу тесты повторно. Так же было-бы неплохо провести их хотя-бы на еще одной машине.
Попробуйте использовать не такие синтетические файлы.
Пусть со всех сторон могут быть разное число пробелов, табуляций и прочих комментариев. Что ближе к реальности.
Записан
k0p4
Гость
Re: Парсинг строки определенного типа
«
Ответ #34 :
Май 05, 2014, 16:24 »
Цитата: Old от Май 05, 2014, 16:19
Цитата: k0p4 от Май 05, 2014, 16:04
ПС. Если кто-то заметил ошибки в коде, пожалуйста, сообщите. Я поправлю и проведу тесты повторно. Так же было-бы неплохо провести их хотя-бы на еще одной машине.
Попробуйте использовать не такие синтетические файлы.
Пусть со всех сторон могут быть разное число пробелов, табуляций и прочих комментариев. Что ближе к реальности.
Таки ближе к реальности мои тесты. Например, у себя в проекте я писал парсер PLS файлов. PLS файлы от веб-сервиса, как правило, приходили без лишних пробелов, табов, и тд.
Сделал так, ничего кардинально не изменилось:
Цитировать
QVector<QString> GenerateList()
{
QVector<QString> mVec;
int counter = 0;
for (size_t ix = 0; ix < 100000; ++ix)
{
if (counter == 5)
mVec.push_back(QString(" -Y " + QString::number(qrand()) + " +X " + QString::number(qrand())));
else if (counter == 10)
mVec.push_back(QString("#-Y " + QString::number(qrand()) + " +X " + QString::number(qrand()) + " b "));
else
mVec.push_back(QString("-Y " + QString::number(qrand()) + " +X " + QString::number(qrand())));
}
return mVec;
}
«
Последнее редактирование: Май 05, 2014, 16:28 от k0p4
»
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Парсинг строки определенного типа
«
Ответ #35 :
Май 05, 2014, 16:26 »
Цитата: k0p4 от Май 05, 2014, 16:10
Цитировать
Во всех этих случаях Вам придется немало посуетиться с гордым/крутым "решением в 1 строку" и оно станет не таким уж простым. В то же время тупенький разбор "слово за словом" выдержит эту нагрузку без проблем.
Разбор "слово за словом" при новых условиях придётся модифаить. Как и регексп. Как и фаинд. А изменения не станут проблемой, в принципе, ни в одном из случаев.
Не уверен. Предположим заданы такие правила (на мой взгляд совершенно простые и разумные)
X(Y) - задать абсолютное значение
+X(Y) - добавить к текущему значению
-X(Y) - отнять от текущего значения
Как порешать с regexp?
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Парсинг строки определенного типа
«
Ответ #36 :
Май 05, 2014, 16:28 »
Цитата: Igors от Май 05, 2014, 16:26
Как порешать с regexp?
Почитать про регулярные выражения?
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Парсинг строки определенного типа
«
Ответ #37 :
Май 05, 2014, 16:32 »
Цитата: Old от Май 05, 2014, 16:28
Почитать про регулярные выражения?
Так читайте, я ж Вам не запрещаю
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Парсинг строки определенного типа
«
Ответ #38 :
Май 05, 2014, 16:33 »
Цитата: Igors от Май 05, 2014, 16:32
Так читайте, я ж Вам не запрещаю
Я уже почитал, поэтому такие наивные вопросы как у вас у меня и не возникают.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Парсинг строки определенного типа
«
Ответ #39 :
Май 05, 2014, 16:53 »
Цитата: k0p4 от Май 05, 2014, 16:24
Сделал так, ничего кардинально не изменилось:
Почему, вы рассчитываете, что вокруг "+X " " -Y " пробелы? Может там табуляции?
И чем больше будет таких "может" - тем больше вы будете добавлять проверок/условий.
А с регулярками вы просто будете чуть менять правила и то, если понадобиться.
По скорости - есть другие библиотеки с регуляркой, более быстрые чем в Qt. Зато вы получаете прозрачный код, который можно легко расширять с усложнением правил.
Записан
Bepec
Гость
Re: Парсинг строки определенного типа
«
Ответ #40 :
Май 05, 2014, 17:02 »
Выражу мысль простую - если формат известен и не меняется, то любое решение с ним справится.
Если у формата имеются допущения и особенности, то простое решение выиграет. Ибо остальные будут являть собой регэксп или аналог и дополнительную обвязку
Универсального формата нет и не будет. И добавочные возможности приёма данных в 90% случаях избыточны. Ибо строится всё на формате. Без формата нет программы и нет регэкспа и нет рабочей версии. Профит
Изменяемый формат = изменение любой программы.
Потому результат должен удовлетворять простым условиям. Если условия не проходят, строка/элемент отбрасываются.
Записан
k0p4
Гость
Re: Парсинг строки определенного типа
«
Ответ #41 :
Май 05, 2014, 17:04 »
Цитировать
Может там табуляции?
А разница для кода какая будет? Если данные пришли не корректные - значит не корректные, - дропаем их.
Цитировать
И чем больше будет таких "может" - тем больше вы будете добавлять проверок/условий.
А регулярку и менять не надо! : )
Цитировать
А с регулярками вы просто будете чуть менять правила и то, если понадобиться.
А в коде я добавлю 1-2 дополнительных if`a.
Цитировать
По скорости - есть другие библиотеки с регуляркой, более быстрые чем в Qt.
Речь шла ИМЕННО про Qt. Ну и вряд ли они будут быстрей, чем простая реализация "в лоб".
Цитировать
Зато вы получаете прозрачный код, который можно легко расширять с усложнением правил.
ИМХО код без регулярок куда как прозрачней. И уж если речь зашла о поддержке, то код без регулярок куда проще поддерживать сторонним разработчикам, тем более низкоквалифицированным.
И вообще, в посте ТСа был вопрос как сделать это средствами Qt. Предложенное ТСом решение рабочее, но как мне кажется, не оптимальное. Регулярки конкретно для этой задачи не подходят - скорость в приоритете. Остаётся только решение в лоб, которое, кстати, показало лучшую скорость.
Вместо заключения:
Я не спорю с полезностью и удобность регулярок, но на таких мелких задачах больше подходит решение в лоб. Строго моё мнение : )
«
Последнее редактирование: Май 05, 2014, 17:11 от k0p4
»
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Парсинг строки определенного типа
«
Ответ #42 :
Май 05, 2014, 17:13 »
Цитата: k0p4 от Май 05, 2014, 17:04
А разница для кода какая будет? Если данные пришли не корректные - значит не корректные, - дропаем их.
А почему они не корректные? Табуляция такой же символ разделитель как и пробел.
Цитата: k0p4 от Май 05, 2014, 17:04
А в коде я добавлю 1-2 дополнительных if`a.
Вот-вот. На каждый чих. А потому так в этом погрязните, что сами ничего не сможете разобрать.
Цитата: k0p4 от Май 05, 2014, 17:04
ИМХО код без регулярок куда как прозрачней.
Это пока все так легко и просто. А теперь представьте, что выдернуть нужно не цифры, а номер телефон и email. Проверить их на валидность и выдернуть.
А так можно принять что в файле позиции чисел фиксированы:
-Y 00012 +X 01234
И выдергивать их из строку по точным смещениям: первое число - подстрока 3-7 символ; второе число - подстрока 11-15.
Ну а что, будет еще быстрей.
Цитата: k0p4 от Май 05, 2014, 17:04
тем более низкоквалифицированным.
А ну тогда да. Про низкоквалифицированных поддержалщиков я уже писал свое мнение на форуме.
«
Последнее редактирование: Май 05, 2014, 17:17 от Old
»
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Парсинг строки определенного типа
«
Ответ #43 :
Май 05, 2014, 17:14 »
Цитата: k0p4 от Май 05, 2014, 17:04
на таких мелких задачах больше подходит решение в лоб. Строго моё мнение : )
Мелкие задачи имеют свойство сильно укрупняться.
Записан
Bepec
Гость
Re: Парсинг строки определенного типа
«
Ответ #44 :
Май 05, 2014, 17:29 »
"Из пушки по воробьям" ©
Подобное уже встречалось в моей практике. Для 3 классов была создана фабрика классов, сериализация данных через S11n и ноды (что совсем не подходило для данных и приходилось костыли ставить). При том что парсер этого формата и эти классы я переписал за 2 дня. И вместо 1 непонятного и неописуемого класса, используеющего буст и s11n и Qt (описать мог только создатель) появились 3 класса, понятных всем.
PS "Самодокументируемость кода указывает на его простоту и гениальность" ©
Записан
Страниц:
1
2
[
3
]
4
5
...
8
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...