![]() |
|
![]() ![]() ![]() |
|
vlarry |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 153 Регистрация: 16.8.2009 Репутация: нет Всего: нет |
Добрый день, форумчане! Помогите пожалуйста решить проблему с разбором текста с помощью регулярных выражений. Суть вот в чем: с устройства получаю список файлов в таком формате:
#LSCRIPT: "AaStart.py",625 #LSCRIPT: "Alarm.pyo",2921 #LSCRIPT: "Alias.pyo",111 #LSCRIPT: "Cache.pyo",2491 #LSCRIPT: "Config.ini",680 #LSCRIPT: "Config.pyo",8750 #LSCRIPT: "Float.pyo",4470 #LSCRIPT: "Func.pyo",3125 #LSCRIPT: "GPSInt.pyo",4146 #LSCRIPT: "History.pyo",4064 #LSCRIPT: "IO.pyo",3477 #LSCRIPT: "IPInt.pyo",6723 #LSCRIPT: "main2.pyo",13429 #LSCRIPT: "main3.pyo",10934 #LSCRIPT: "SPIIO.pyo",9432 #LSCRIPT: "xID.ini",11 #LSCRIPT: free bytes: 1925316 OK
но если попробовать несколько раз получить список, то часто в список m_ui->m_lwListScriptModule помещаются не все файлы. Как оказалось проблема заключается в том, что удаляются не все переходы на новую строку и возврат каретки методом strList.remove(QRegExp("[\r\n]+"));. И это происходит не всякий раз. Могу произвести получение файлов несколько раз и все нормально, но рано или поздно это проявляется...Помогите пожалуйста решить эту проблему! Как можно корректно удалить все эти переходы? |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Ищи:
"#LSCRIPT: \"([A-Za-z0-9]+\.[A-Za-z0-9]+)\",(\d+)" cap(1) будет имя файла, cap(2).toInt() - длина. Добавлено через 4 минуты и 21 секунду А зачем вообще удалять переводы строк? |
|||
|
||||
vlarry |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 153 Регистрация: 16.8.2009 Репутация: нет Всего: нет |
извините, что не отвечал, только сейчас добрался до компьютера...сейчас проверю выражение....а с переходами, почему-то не хочет выводить все файлы в список....
Добавлено через 11 минут и 21 секунду проверил выражение, но лучше не стало, все равно список полностью строиться через раз, а потеря файлов как раз и происходит, когда появляются лишние пробелы...что ему еще не хватает?! На рисунке правильная работа при обработке списка файлов...вот то что выводится в консоль через qDebug():
"#LSCRIPT #LSCRIPT: "AaStart.py",625 #LSCRIPT: "Alarm.pyo",2921 #LSCRIPT: "Alias.pyo",111 #LSCRIPT: "Cache.pyo",2491 #LSCRIPT: "Config.ini",680 #LSCRIPT: "Config.pyo",8750 #LSCRIPT: "Float.pyo",4470 #LSCRIPT: "Func.pyo",3125 #LSCRIPT: "GPSInt.pyo",4146 #LSCRIPT: "History.pyo",4064 #LSCRIPT: "IO.pyo",3477 #LSCRIPT: "IPInt.pyo",6723 #LSCRIPT: "main2.pyo",13429 #LSCRIPT: "main3.pyo",10934 #LSCRIPT: "SPIIO.pyo",9432 #LSCRIPT: "xID.ini",11 #LSCRIPT: free bytes: 1925316 OK " Присоединённый файл ( Кол-во скачиваний: 5 ) ![]() |
|||
|
||||
vlarry |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 153 Регистрация: 16.8.2009 Репутация: нет Всего: нет |
а вот вид неправильной работы и вывод в консоль:
"#LSCRIPT #LSCRIPT: "AaStart.py",625 #LSCRIPT: "Alarm.pyo",2921 #LSCRIPT: "Alias.pyo",111 #LSCRIPT: "Cache.pyo",2491 #LSCRIPT: "Config.ini",680 #LSCRIPT: "Config.pyo",8750 #LSCRIPT: "Float.pyo",4470 " "#LSCRIPT: "Func.pyo",3125 #LSCRIPT: "GPSInt.pyo",4146 #LSCRIPT: "History.pyo",4064 #LSCRIPT: "IO.pyo",3477 #LSCRIPT: "IPInt.pyo",6723 #LSCRIPT: "main2.pyo",13429 #LSCRIPT: "main3.pyo",10934 #LSCRIPT: "SPIIO.pyo",9432 #LSCRIPT: "xID.ini",11 #LSCRIPT: free bytes: 1925316 OK " Присоединённый файл ( Кол-во скачиваний: 6 ) ![]() |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Проблема не в RegExp. Твой первоначальный тоже рулит. Переводы строк убирать не надо - они в RegExpе пробельные символы - "\\s".
Вероятно, данные принимаются не за один slotReadData(), а за несколько. А ты каждый раз делаешь очистку списка. Нужно соединять принятые данные, искать начало "AT\\s*#LSCRIPT" и конец "OK" передачи и между ними искать имена файлов. Это сообщение отредактировал(а) math64 - 26.4.2013, 09:54 |
|||
|
||||
vlarry |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 153 Регистрация: 16.8.2009 Репутация: нет Всего: нет |
спасибо, попробую...уже думал попробовать распарсить построчно, разбив split-ом в список...
|
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
NB: AT и OK могут встретиться внутри имени файла, так что ищи их соответственно.
|
|||
|
||||
vlarry |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 153 Регистрация: 16.8.2009 Репутация: нет Всего: нет |
спасибо, учту...
|
|||
|
||||
vlarry |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 153 Регистрация: 16.8.2009 Репутация: нет Всего: нет |
отменил очистку списка и да действительно все файлы сыпятся в список без проблем...получается прием файлов от устройства идет не одним списком, как вы, math64 и предполагали...Чтобы придумать, чтобы список обрабатывался только когда он целиком получен?
|
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Так я уже говорил: конец списка определяеться по получению "\r\nOK\r\n", а начало - по "AT".
Принимать все можешь даже по одному байту. |
|||
|
||||
vlarry |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 153 Регистрация: 16.8.2009 Репутация: нет Всего: нет |
спасибо, я прописал strList.contains(QRegExp("(^AT)")); и strList.contains(QRegExp("(OK$)")); и получилось что он конец списка по OK не находил...сейчас добавил символ перехода, то все нормально, нашел OK..., буду дальше строки разбирать...спасибо...
Это сообщение отредактировал(а) vlarry - 26.4.2013, 16:11 |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
^ и $ - ?по умолчанию? начало и конец QString, поэтому они в данном случае бесполезны.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |