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

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

07.11.2019, 14:22. Показов 2219. Ответов 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,932
Записей в блоге: 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,932
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru