Автор |
Тема: Быстрое удаление символов (Прочитано 31125 раз) |
|
Vladimir
Я люблю этот Форум!
Просмотреть Профиль | WWW |
Сообщений: 264
|
Коллеги, нужна помощь! Имеется строка из которой надо удалять некоторые символы. Количество символов ограничено и они известны заранее. Пример строки: BND-42+S5 Пример "лишних" символов ~!"#;%:?*()_+- Строка после обработки: BND42S5 Нужен самый скорострельный алгоритм на ФБП.
|
« Изменён в : 03.01.17 в 17:26:11 пользователем: Vladimir » |
Зарегистрирован |
С уважением, Владимир
|
|
|
mine-R
compact & flexible rulezzz
Просмотреть Профиль |
Сообщений: 150
|
|
Re: Быстрое удаление символов
« Ответить #1 В: 06.01.17 в 11:31:40 » |
Цитировать | Править
|
По максимальной скорострельности есть большие сомнения но "для затравки" - вариант от кэпа-очевидность: Code:C='' S='BND-42+S5' for I=1 to [length S] D=[hc S,I] if (D>48)&(D<123)&(D<>58)&(D<>59)&(D<>63)&(D<>95) C=C+[ch D] endif endfor C=[strip C] printstr C |
| UPD: Чуть более скорострельный "близнец": Code:C='' Z='~!"#;%:?*()_+-' S='BND-42+S5' for I=1 TO [length S] D=[cp S,I,1] if [ps D,Z]=0 C=C+D endif endfor C=[strip C] printstr C |
|
|
« Изменён в : 06.01.17 в 12:33:34 пользователем: mine-R » |
Зарегистрирован |
|
|
|
Vladimir
Я люблю этот Форум!
Просмотреть Профиль | WWW |
Сообщений: 264
|
|
Re: Быстрое удаление символов
« Ответить #2 В: 09.01.17 в 00:52:25 » |
Цитировать | Править
|
Спасибо за отклик. Идея искать удаляемые символы "наоборот"в строке Z может оказаться плодотворной. Сейчас не могу заняться исследованием - приболел. Надеюсь дать отчет до 15 яваря.
|
|
Зарегистрирован |
С уважением, Владимир
|
|
|
mine-R
compact & flexible rulezzz
Просмотреть Профиль |
Сообщений: 150
|
|
Re: Быстрое удаление символов
« Ответить #3 В: 09.01.17 в 11:25:12 » |
Цитировать | Править
|
Наискорейшего Вам выздоровления! Меня вот когда-то "озадачил" вопрос избавления от [strip] перед выводом, т.е. от начального пустого символа в виде пробела (С=''). В DOS'e раньше можно было "инициализироваться в backspace" (т.е. в [ch 8]). В Сервере этот приём не проходит. Можно конечно организовать счетчик и обработать как угодно первую итерацию, но, возможно, у кого-нибудь есть простое и изящное решение?
|
|
Зарегистрирован |
|
|
|
Vladimir
Я люблю этот Форум!
Просмотреть Профиль | WWW |
Сообщений: 264
|
|
Re: Быстрое удаление символов
« Ответить #4 В: 16.01.17 в 06:08:52 » |
Цитировать | Править
|
on 09.01.17 в 00:52:25, Vladimir wrote:Спасибо за отклик. Идея искать удаляемые символы "наоборот"в строке Z может оказаться плодотворной. Сейчас не могу заняться исследованием - приболел. Надеюсь дать отчет до 15 яваря. |
| Я поставил много разных экспериментов, описывать их все не имеет смысла. Самый быстрый результат, которого удалось добиться - вот. ПП :C4 повторенная миллион раз потребовала 6~8 секунд на выполнение. Что особеено приятно - алгоритм корректно работает по концам строки и по пробелам. Идея принадлежит mine-R, за что я ему премного благодарен. Z = '-+~!@#$%^&*()_=`<>?,.;:"[]{}\|_+ xX' S = ' -BND-42+ S5xBND#s> ' Исходная ^^^^^^^^^^^^^^^^^^^^S^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ T0 = [:TIMER] for ii = 1 to 1000000 S = [:C4 Z, S] endfor ET = [:TIMEDCD [:TIMER] - T0] ELAPSED TIME = ^^^^^^^^^^^ET^^^^^^^^^^^^^^^^^^^^^^^^^^^ S = S+'*' добавим * чтобы видеть последний пробел Результат ^^^^^^^^^^^^^^^^^^^^S^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ stop * :C4 (S) * Z chars to remove * S string to claen local i, C, L CS = ' ' _Init clean string L = [length S] for i = 1 to L C = [cp S, i, 1]] if [ps C, Z] = 0 CS = CS + C endif endfor CS = [strip CS] return (CS)
|
« Изменён в : 16.01.17 в 06:13:37 пользователем: Vladimir » |
Зарегистрирован |
С уважением, Владимир
|
|
|
Boris, Kiev.
Адепт ФБП с 1996г.
Просмотреть Профиль | E-мэйл
Сообщений: 875
|
|
Re: Быстрое удаление символов
« Ответить #5 В: 17.01.17 в 17:14:03 » |
Цитировать | Править
|
Аналогичный алгоритм использую для очистки имени файла которое присваивается по пользовательскому вводу и частенько может содержать недопустимые WinОС символы: \ / : * ? ” < > | Замечу, что в случае длины обрабатываемой строки большей, чем длина строки «спецсимволов», то скорее всего поиск спецсимволов в целевой строке будет эффективнее сугубо по причине сокращения практически сходного цикла. Если речь идёт о единичной процедуре в каком-то сценарии, то ломать копья с вариантами этого алгорита не стоит. В идеальном и универсальном варианте для массы обращений в одном сценарии, можно собрать алгоритм с варьированием обоих вариантов в зависимости от параметров отработки каждого на предыдущем варианте входной строки, конечно при условии, что ряд обращений к этому универ-алгоритму будет аналогичным.
|
« Изменён в : 17.01.17 в 17:18:38 пользователем: Boris, Kiev. » |
Зарегистрирован |
|
|
|
Boris, Kiev.
Адепт ФБП с 1996г.
Просмотреть Профиль | E-мэйл
Сообщений: 875
|
|
Re: Быстрое удаление символов
« Ответить #6 В: 17.01.17 в 17:16:43 » |
Цитировать | Править
|
on 09.01.17 в 11:25:12, mine-R wrote: Меня вот когда-то "озадачил" вопрос избавления от [strip] перед выводом, т.е. от начального пустого символа в виде пробела (С=''). В DOS'e раньше можно было "инициализироваться в backspace" (т.е. в [ch 8]). В Сервере этот приём не проходит. Можно конечно организовать счетчик и обработать как угодно первую итерацию, но, возможно, у кого-нибудь есть простое и изящное решение? |
| Для особо непонятливых дайте пару rpt-строк по своей проблеме.
|
|
Зарегистрирован |
|
|
|
mine-R
compact & flexible rulezzz
Просмотреть Профиль |
Сообщений: 150
|
|
Re: Быстрое удаление символов
« Ответить #7 В: 17.01.17 в 19:10:23 » |
Цитировать | Править
|
on 17.01.17 в 17:16:43, Boris, Kiev. wrote:Для особо непонятливых дайте пару rpt-строк по своей проблеме. |
| "Как избавиться от пробела в начале строки, при инициализации переменной в строковый пустой символ, не используя [strip]" Cобственно, как оказалось, и решение уже было у меня, просто затерялось среди множества прочих обрывков кода Вместо инициализации в '' , можно инициализироваться в "возврат каретки". Вроде как действует и в Сервере.. Итоговый код вышеуказанного алгоритма, с подобной инициализацией будет выглядеть так: Code:C=[ch 13] Z='~!"#;%:?*()_+-' S='BND-42+S5' for I=1 TO [length S] D=[cp S,I,1] if [ps D,Z]=0 C=C+D endif endfor printstr C |
| В данном конкретном алгоритме, конечно совсем это избавление от strip'a ни к чему. Привел для наглядности.
|
|
Зарегистрирован |
|
|
|
Boris, Kiev.
Адепт ФБП с 1996г.
Просмотреть Профиль | E-мэйл
Сообщений: 875
|
|
Re: Быстрое удаление символов
« Ответить #8 В: 18.01.17 в 15:27:52 » |
Цитировать | Править
|
on 17.01.17 в 19:10:23, mine-R wrote: "Как избавиться от пробела в начале строки, при инициализации переменной в строковый пустой символ, не используя [strip]" |
| Замечу, что и [strip ‘ ‘] не даст вожделенной вами «пустой» строки, т.к. strip над пробелом(ами) оставляет единственный пробел. И возврат каретки в этом случае мало чем отличается от использования другого символа, ведь он всего навсего управляющий символ при выводе и не более, ведь длина этой строки всё также будет с учетом единички от него. Мне не очень до сих пор понятно, какую такую «досаду» вы хотите объехать. Инициализировать переменную любым символом, отработать с этой переменной, отрезать этот символ на выходе и вуаля, в чём «досада»?
|
|
Зарегистрирован |
|
|
|
mine-R
compact & flexible rulezzz
Просмотреть Профиль |
Сообщений: 150
|
|
Re: Быстрое удаление символов
« Ответить #9 В: 18.01.17 в 23:17:46 » |
Цитировать | Править
|
on 18.01.17 в 15:27:52, Boris, Kiev. wrote:...Мне не очень до сих пор понятно, какую такую «досаду» вы хотите объехать. Инициализировать переменную любым символом, отработать с этой переменной, отрезать этот символ на выходе и вуаля, в чём «досада»? |
| Я не писал, что это "досада" Попробуйте убрать [strip] из алгоритма с переменной, инициализированной в '' и сравните с последним алгоритмом, в котором уже убран [strip]. Мне кажется, будет наглядно видна разница. В первом случае, в начале строки окажется "пробел". А во времена, когда DOS использовался не только как конструктор, можно было к примеру использовать такой прием удаления пятисимвольных слов из конца строки: Code:A=[ch8]+[ch8]+[ch8]+[ch8]+[ch8] B='111112222233333' C=B+A printstr C |
|
|
|
Зарегистрирован |
|
|
|
Boris, Kiev.
Адепт ФБП с 1996г.
Просмотреть Профиль | E-мэйл
Сообщений: 875
|
|
Re: Быстрое удаление символов
« Ответить #10 В: 19.01.17 в 09:41:21 » |
Цитировать | Править
|
on 18.01.17 в 23:17:46, mine-R wrote: Я не писал, что это "досада" Попробуйте убрать [strip] из алгоритма с переменной, инициализированной в '' и сравните с последним алгоритмом, в котором уже убран [strip]. Мне кажется, будет наглядно видна разница. В первом случае, в начале строки окажется "пробел". А во времена, когда DOS использовался не только как конструктор, можно было к примеру использовать такой прием удаления пятисимвольных слов из конца строки: Code:A=[ch8]+[ch8]+[ch8]+[ch8]+[ch8] B='111112222233333' C=B+A printstr C |
| |
| Тогда желательно "не путать праведное с грешным". Давайте разделять вопрос работы со строками и вопрос управляющих символов при выводе строк.
|
|
Зарегистрирован |
|
|
|
|
|