Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужен хитрый и быстрый TRIM, причем с выпендрончиками... 
:(
    Опции темы
Akina
Дата 20.8.2004, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Naghual
Дата 20.8.2004, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1893
Регистрация: 15.5.2004
Где: Украина, Днепр

Репутация: 26
Всего: 49



А ты используй функцию Split в теле цикла по перебору разделителей.


--------------------
Я желаю всем Счастья!
PM ICQ Skype   Вверх
Akina
Дата 20.8.2004, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Naghual
Прости, не понял.

Собсно сейчас что: считывается в строковую переменную MEMO-поле, оно режется в массив на строки (tmpStrArray=Split(MemoText.Text, vbCR & vbLF)), после чего каждая из полученных строк массива (в цикле есссно) TRIMается. Сложность в том что некоторые непробельные символы тоже должны быть убраны (например ведущие или конечные точки, запятые, тире и т.п.) - именно вот этот TRIM и нужно ускорить...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Эд
Дата 20.8.2004, 12:30 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
Дата 20.8.2004, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1893
Регистрация: 15.5.2004
Где: Украина, Днепр

Репутация: 26
Всего: 49



Это я не понял твой вопрос. Пардон. notify.gif

Можеш поподробнее расписать задачку?
Я про ТРИМ не совсем понял.
Можно с примерами строк.


--------------------
Я желаю всем Счастья!
PM ICQ Skype   Вверх
Akina
Дата 20.8.2004, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Naghual
Пример строки (начальная и конечная кавычки не входят, просто ограничивают):
" . $ Строка, кою надо зачистить. ,, "
Список пробельных символов:
chr$(0)...chr$(47); chr$(58)...chr$(64)
Результат очистки:
"Строка, кою надо зачистить"

----------------------------

Хмм... Эд прав... надо попробовать... гнать 2 указателя по строке в цикле...



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
cardinal
Дата 20.8.2004, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 19
Всего: 99



Цитата(Akina @ 20.8.2004, 12:39)
Хмм... Эд прав... надо попробовать... гнать 2 указателя по строке в цикле...

Как попробуешь - напиши... smile.gif Интересно...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0502 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.