![]() |
|
Модераторы: Akina |
![]()
|
|
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 34 Всего: 454 |
Исходные данные:
Есть строка (xStr). Есть набор символов (xDelim), считающихся пробельными (в виде строки в переменной или константе). Задача: Сделать максимально быстрый TRIM этих символов из начала и/или хвоста строки. Что испробовано (суть): 1) If Instr(xDelim,Mid(xStr,n,1))>0 Then Mid(xStr,n,1)=" " 2) If Instr(xDelim,Left(xStr,1))>0 Then xStr=Mid(xStr,2) По любому получается медленно... хвост обрабатывать еще геморройнее. Поскольку функция используется при конвертировании огромных (сотни Мб) таблиц (TRIMать надо SPLITнутые многострочные MEMO-поля) - времени требуется немеряно... Идеи? Это сообщение отредактировал(а) Akina - 20.8.2004, 10:08 -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Naghual |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1893 Регистрация: 15.5.2004 Где: Украина, Днепр Репутация: 26 Всего: 49 |
А ты используй функцию Split в теле цикла по перебору разделителей.
-------------------- Я желаю всем Счастья! |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 34 Всего: 454 |
Naghual
Прости, не понял. Собсно сейчас что: считывается в строковую переменную MEMO-поле, оно режется в массив на строки (tmpStrArray=Split(MemoText.Text, vbCR & vbLF)), после чего каждая из полученных строк массива (в цикле есссно) TRIMается. Сложность в том что некоторые непробельные символы тоже должны быть убраны (например ведущие или конечные точки, запятые, тире и т.п.) - именно вот этот TRIM и нужно ускорить... -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Эд |
|
|||
|
Unregistered |
Т.е. ты заменяешь начальные и конечные разделители пробелами поштучно, а потом усекаешь.
А что если задать поиск (в цикле) первого НЕ пробельного знака, а потом усечь все , что до него при помощи Right$ / Ltft$ ? Я бы сделал так: (пишу с ума, смотри только идею, синтаксис не соблюден) DIM nonDelim(255) As Boolean 'массив-дешифратор for i=0 to 255 : nonDelim(i)=True: next i 'заполняем этот массив единицами 'а пробельные коды - нулями nonDelim(32) = False nonDelim(&h2C) = False nonDelim(&h2E) = False . . . 'а теперь, при помощи такого массива находим первый значащий символ for i=1 to Len(tmpString$) if nonDelim(Asc(mid$(tmpString$,i,1))) = True Then posution = i i = Len(tmpString$) 'стоп цикла, или можно Exit сделать end if LengthNew= Len(tmpString$) - position 'сколько символов остается tmpString$ = Right$(tmpString$,LengthNew) 'усекаем Ну и так же с конца. Применяю For вместо While, для избежания проблем на строках из одних разделителей и т. п, но это детали, по ходу экспериментов. Удачи ! Эд |
|||
|
||||
| Naghual |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1893 Регистрация: 15.5.2004 Где: Украина, Днепр Репутация: 26 Всего: 49 |
Это я не понял твой вопрос. Пардон.
Можеш поподробнее расписать задачку? Я про ТРИМ не совсем понял. Можно с примерами строк. -------------------- Я желаю всем Счастья! |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 34 Всего: 454 |
Naghual
Пример строки (начальная и конечная кавычки не входят, просто ограничивают): " . $ Строка, кою надо зачистить. ,, " Список пробельных символов: chr$(0)...chr$(47); chr$(58)...chr$(64) Результат очистки: "Строка, кою надо зачистить" ---------------------------- Хмм... Эд прав... надо попробовать... гнать 2 указателя по строке в цикле... -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 19 Всего: 99 |
Как попробуешь - напиши... -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
![]()
|
| Правила форума "VB6" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | VB6 | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |