Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458

Быстрая работа со строкой (быстрый парсинг)

07.11.2019, 14:22. Показов 2237. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть строка вида "имя1(значение1),имя2(значение2),"
Где "имя" и "значение" могут иметь произвольную длину (от 1 символа и до ...), а сами строки включать жуткие количества таких сочетания "имя-значения" и быть до 100 и более килобайт ...

Задача - обеспечить скоростной парсинг строки с обеспечением функционала
сейчас идут прилагаемые функции типа "есть ли имя, количество блоков, поиск имени по номеру, поиск имени по значению, поиск значения по номеру, поиск значения по имени, ... и др."

Делается это так: при получении строки она парсится с формированием ключевой для этой функции информацией о строке, информация укладывается в кеш и в дальнейшем, при ее наличии в кеше, изымается оттуда и по ней осуществляется работа со строкой.

Парсинг осуществляется:
- перекладыванием строки в байтовый массив
- replace всех "(", ")" и ",", далее split по сочетанию на замененные символы (у меня это "#%&") и перебором полученных реперных точек, через которые получаю точки входа и выхода имен и значений ...

Это на 1-2 десятка процентов быстрее, чем в тупую посимвольно перебирать байтовый массив (даже анализируя лишь второй байт как ="0" для ключевых симоволов) ... а на больших длинах строк в десятки килобайт и больше - полный перебор МЕДЛЕННЕЕ в 2-3 раза, чем первый вариант с 3-ым replace и split'ом

Еще в десятки раз медленне вырезки Mid'ом и всякие "objRegExp.Pattern = "[\(\)\,]" ...

Что добивает - перебор массива строки на уровне сравнения чисел медленнее чем "3 раза машинный перебор той же строки и каждый раз с заменой каких-то символов (с выделением памяти и перезаписью строки) + еще один перебор с резкой строки (опять же с выделением памяти и записью)" ... хочется спросить ЧТО ТАМ ПРОИСХОДИТ и почему единичный перебор строки на уровне численного сравнения половины (из нее) байт- так медленнее?!

И самое важное - кто что может предложить для более быстрой работы со строкой?! КАК перебирать, резать и парсить строку еще быстрее? Может какой-то экстравагантный способ работы со строкой или через указатель?

Самый быстрый из найденных вариантов:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Private Function fРазбор1(dСтрокаОбработки$)
 Dim dРабочСтр_byte() As Byte: dРабочСтр_byte = dСтрокаОбработки$
 dРазбивка = Split(Replace(Replace(Replace(dСтрокаОбработки$, "(", "&#"), ")", "&#"), ",", "&#"), "&#")
 For i1& = 0 To UBound(dРазбивка) - 1
  dДлинаЭлемента_dРазбивка& = Len(dРазбивка(i1&))
  dСчетчик& = dСчетчик& + dДлинаЭлемента_dРазбивка& + 1
  
  dКодСимволаСтроки2& = dРабочСтр_byte((dСчетчик& - 1) * 2 + 1)
  If dКодСимволаСтроки2& = 0 Then
   dКодСимволаСтроки1& = dРабочСтр_byte((dСчетчик& - 1) * 2)
   
   Select Case dКодСимволаСтроки1&
    Case 40
     dСчетчикБлоков& = dСчетчикБлоков& + 1
    Case 41
     dСчетчикБлоков& = dСчетчикБлоков& - 1
    Case 44
     ' запятая
   End Select
  End If
 Next i1&
End Function
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.11.2019, 14:22
Ответы с готовыми решениями:

быстрый парсинг
<? $content= file_get_contents('http://kosmoskan.ru/?page=rasp'); preg_match_all('~<h3 align="left">.*<p>(+)</p>.*</h3>~siuU',...

Быстрый парсинг Excel
Господа, прошу помощи. Суть: есть (и раз в неделю добавляется) сотня файлов *.xls. Содержимое - 1 лист примерно 500 строк на 60 столбцов....

Быстрый парсинг строки
Всем доброго времени суток... Прошу разъяснить что делаю не так. Получаю строку вида, нужно ее обработать с минимальными задержками, по...

5
Модератор
Эксперт MS Access
 Аватар для shanemac51
12231 / 5078 / 814
Регистрация: 07.08.2010
Сообщений: 14,937
Записей в блоге: 4
07.11.2019, 14:57
Цитата Сообщение от StepInLik Посмотреть сообщение
Есть строка вида "имя1(значение1),имя2(значение2),"
хотелось бы увидеть типичную строку вместо 40 строк общих слов
например: есть ли запятые,апострофы внутри апострофов,какова максимальная длина ключевых слов, все ли значения в апострофах или числовые/даты без апострофов
0
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
07.11.2019, 18:02  [ТС]
Цитата Сообщение от shanemac51 Посмотреть сообщение
есть ли запятые,апострофы внутри апострофов,какова максимальная длина ключевых слов, все ли значения в апострофах или числовые/даты без апострофов
На строку не накладывается никаких ограничений, за исключением только того, что элементы разделены запятыми, значение внутри скобок, которые указываются непосредственно за именем
нет ограничений ни на длину имени ни на длину значений ... по факту, судя по максимумам ... имя может быть до 300-500 символов, значение - до предела длины строки как типа

Например: ПроСемью(мама(пошла гулять),ДругиеЧленыСемьи(Папа(пошел спать),Сестра(села учить уроки))),ПроМеня(я не люблю гречку)

Длина строки - предел длины строки как типа, количество элементов - любое, вложенность - любая
Фактически это сериализация данных, которая является базовой структурой и позволяет не думать ни о типах ни о структурах ни о стандартах передачи и хранения данных ... но за это приходится платить временем парсинга

Добавлено через 1 час 6 минут
На наверное законный вопрос "а что если надо скобку или запятую добавить в качестве элемента строки значения или имени?"
Добавлю ответ: при внесении таких "служебных" символов, они преждевременно должны отражаться в строке в качестве "псевдо-значений" в виде (например) "[/$запятая]", что при выдаче имени или значения на выходе преобразуется в соответствующий символ
0
Модератор
Эксперт MS Access
 Аватар для shanemac51
12231 / 5078 / 814
Регистрация: 07.08.2010
Сообщений: 14,937
Записей в блоге: 4
07.11.2019, 21:47
весьма мохоже на JSON, только разделители иные
JSON (англ. JavaScript Object Notation, обычно произносится как /ˈdʒeɪsən/ JAY-sən [2]) — текстовый формат обмена данными, основанный на JavaScript. Как и многие другие текстовые форматы, JSON легко читается людьми. Формат JSON был разработан Дугласом Крокфордом[3].

Несмотря на происхождение от JavaScript (точнее, от подмножества языка стандарта ECMA-262 1999 года), формат считается независимым от языка и может использоваться практически с любым языком программирования. Для многих языков существует готовый код для создания и обработки данных в формате JSON.

За счёт своей лаконичности по сравнению с XML, формат JSON может быть более подходящим для сериализации сложных структур. Применяется в веб-приложениях как для обмена данными между браузером и сервером (AJAX), так и между серверами (программные HTTP-сопряжения).

Поскольку формат JSON является подмножеством синтаксиса языка JavaScript, то он может быть быстро десериализован встроенной функцией eval()
1
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
08.11.2019, 10:09  [ТС]
Цитата Сообщение от shanemac51 Посмотреть сообщение
весьма мохоже на JSON,
Да, это так.
Но текущей конструкции уже 19 лет и на ней построено очень много потоков и приложений и переделать не представляется возможным.

Не понятно чем занимается VBA перебирая строку через байтовый массив ... почему так долго?
Получается, что с одной стороны мы пытаемся экономить на преобразованиях типов, на операциях ... а он и без нас - тратит ТАМ огромное количество ресурсов не понятно на что?! и наши попытки оптимизации значительно менее эффективны чем мы ожидаем ...
0
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
08.11.2019, 18:29  [ТС]
Из того что пока найдено: http://www.xbeat.net/vbspeed/index.htm
+ спасибо shanemac51 за подсказку
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.11.2019, 18:29
Помогаю со студенческими работами здесь

Быстрый парсинг огромного txt файла (800 мб)
В общем нужно распарсить в массив Integer-ов огромный текстовый файл (800 мб), состоящий из 1 длинной строки, которая состоит из чисел от 1...

Работа с файлами, чтение/работа со строкой
Доброго времени суток. Начал работать с C++ Builder 6. Есть текстовый файл .txt с различными строками, как можно производить...

Быстрая работа с xlsx
Подскажите, плиз, какой способ работы с xlsx-файлами будет наиболее быстрым? Интересует поиск, удаление, замена (запись). По поводу...

Быстрая работа с пикселями
Нужно перебрать все пиксели в изображении, произвести замену некоторых и прочее... Сейчас использую Bitmap.SetPixel и Bitmap.GetPixel, в...

Быстрая работа с графикой
Добрый день. интересует способ быстрого выведения множества пикселей на экран. мне не нужны полигоны и другие сложные объекты, нужны именно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru