ФИНАНСЫ БЕЗ ПРОБЛЕМ(tm):
ПЕРЕГОВОРНЫЙ ПУНКТ II

Добро пожаловать, Гость. Пожалуйста, выберите:
Вход || Регистрация.
23.05.17 в 08:11:08


Наш сайт | Cтаpый форум (до 08.2003 года) | Интернет-магазин | Видео-лекции
Главная | Помощь | Поиск | Участники | Вход | Регистрация
Модифицированный Клиент CLW32:
Из документации ...
На форуме...

Использование Клиента FCM:
1. Отчетный период и журнал операций.
2. Печать.
3. Экспорт.
4. Многострочная операция.
5. Редактирование многострочных операций.
http://www.fwp-client.com

Технический аудит настройки.
[Читать]

ФИНАНСЫ БЕЗ ПРОБЛЕМ (сетевая) и Opencart:
предлагаем:
1. Выгрузка новых покупателей из интернет-магазина в план счетов и сохранение информации в extrd.dat.
2. Выгрузка данных о заказанном товаре и сохранение в ФБП в журнале операций, номер заказа регистрируем в плане счетов как с.счет.



   Финансы без пpоблем: Пеpеговоpный Пункт II
   Общий pаздел

   Быстрое удаление символов
« Предыдущая Тема | Следующая Тема »
Страниц: 1  Ответить | Уведомлять | Послать Тему | Печатать
   Автор  Тема: Быстрое удаление символов  (Прочитано 700 раз)
Vladimir

***



Я люблю этот Форум!

   
Просмотреть Профиль | WWW |

Сообщений: 226
Быстрое удаление символов
« В: 03.01.17 в 17:24:21 »
Цитировать | Править

Коллеги, нужна помощь!
 
Имеется строка из которой надо удалять некоторые символы. Количество символов ограничено и они известны заранее.
 
Пример строки:   BND-42+S5
Пример "лишних" символов ~!"#;%:?*()_+-
Строка после обработки: BND42S5
 
Нужен самый скорострельный алгоритм на ФБП.
« Изменён в : 03.01.17 в 17:26:11 пользователем: Vladimir » Зарегистрирован

С уважением,
Владимир
mine-R

**



compact & flexible rulezzz

   
Просмотреть Профиль |

Сообщений: 91
Re: Быстрое удаление символов
« Ответить #1 В: 06.01.17 в 11:31:40 »
Цитировать | Править

По максимальной скорострельности есть большие сомнения Smiley но "для затравки" - вариант от кэпа-очевидность:
 
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 |

Сообщений: 226
Re: Быстрое удаление символов
« Ответить #2 В: 09.01.17 в 00:52:25 »
Цитировать | Править

Спасибо за отклик. Идея искать удаляемые символы "наоборот"в строке Z может оказаться плодотворной. Сейчас не могу заняться исследованием - приболел. Надеюсь дать отчет до 15 яваря.
Зарегистрирован

С уважением,
Владимир
mine-R

**



compact & flexible rulezzz

   
Просмотреть Профиль |

Сообщений: 91
Re: Быстрое удаление символов
« Ответить #3 В: 09.01.17 в 11:25:12 »
Цитировать | Править

Наискорейшего Вам выздоровления!  
 
Меня вот когда-то "озадачил" вопрос избавления от [strip] перед выводом, т.е. от начального пустого символа в виде пробела (С=''). В DOS'e раньше можно было "инициализироваться в backspace" (т.е. в [ch 8]). В Сервере этот приём не проходит. Можно конечно организовать счетчик и обработать как угодно первую итерацию, но, возможно, у кого-нибудь есть простое и изящное решение?
Зарегистрирован
Vladimir

***



Я люблю этот Форум!

   
Просмотреть Профиль | WWW |

Сообщений: 226
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.
Moderator

*****



Адепт ФБП  с 1996г.

   
Просмотреть Профиль | E-мэйл

Сообщений: 797
Re: Быстрое удаление символов
« Ответить #5 В: 17.01.17 в 17:14:03 »
Цитировать | Править

Аналогичный алгоритм использую для очистки имени файла которое присваивается по пользовательскому вводу и частенько может содержать недопустимые WinОС символы:
 
\ / : * ? ” < > |  
 
Замечу, что в случае длины обрабатываемой строки большей, чем длина строки «спецсимволов», то скорее всего поиск спецсимволов в целевой строке будет эффективнее сугубо по причине сокращения практически сходного цикла.
 
Если речь идёт о единичной процедуре в каком-то сценарии, то ломать копья с вариантами этого алгорита не стоит.
В идеальном и универсальном варианте для массы обращений в одном сценарии, можно собрать алгоритм с варьированием обоих вариантов в зависимости от параметров отработки каждого на предыдущем варианте входной строки, конечно при условии, что ряд обращений к этому универ-алгоритму будет аналогичным.
« Изменён в : 17.01.17 в 17:18:38 пользователем: Boris, Kiev. » Зарегистрирован
Boris, Kiev.
Moderator

*****



Адепт ФБП  с 1996г.

   
Просмотреть Профиль | E-мэйл

Сообщений: 797
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

   
Просмотреть Профиль |

Сообщений: 91
Re: Быстрое удаление символов
« Ответить #7 В: 17.01.17 в 19:10:23 »
Цитировать | Править

on 17.01.17 в 17:16:43, Boris, Kiev. wrote:
Для особо непонятливых дайте пару rpt-строк по своей проблеме.

 
"Как избавиться от пробела в начале строки, при инициализации переменной в строковый пустой символ, не используя [strip]"
 
Cобственно, как оказалось, и решение уже было у меня, просто затерялось среди множества прочих обрывков кода  Smiley
 
Вместо инициализации в '' , можно инициализироваться в "возврат каретки". Вроде как действует и в Сервере..
Итоговый код вышеуказанного алгоритма, с подобной инициализацией будет выглядеть так:
 
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.
Moderator

*****



Адепт ФБП  с 1996г.

   
Просмотреть Профиль | E-мэйл

Сообщений: 797
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

   
Просмотреть Профиль |

Сообщений: 91
Re: Быстрое удаление символов
« Ответить #9 В: 18.01.17 в 23:17:46 »
Цитировать | Править

on 18.01.17 в 15:27:52, Boris, Kiev. wrote:
...Мне не очень до сих пор понятно, какую такую «досаду» вы хотите объехать.
Инициализировать переменную любым символом, отработать с этой переменной, отрезать этот символ на выходе и вуаля, в чём «досада»?

 
Я не писал, что это "досада"  Smiley
Попробуйте убрать [strip] из алгоритма с переменной, инициализированной в '' и сравните с последним алгоритмом, в котором уже убран [strip].
Мне кажется, будет наглядно видна разница. В первом случае, в начале строки окажется "пробел".
 
А во времена, когда DOS использовался не только как конструктор, можно было к примеру использовать такой прием удаления пятисимвольных слов из конца строки:
 
Code:
A=[ch8]+[ch8]+[ch8]+[ch8]+[ch8]
B='111112222233333'
C=B+A
printstr C
Зарегистрирован
Boris, Kiev.
Moderator

*****



Адепт ФБП  с 1996г.

   
Просмотреть Профиль | E-мэйл

Сообщений: 797
Re: Быстрое удаление символов
« Ответить #10 В: 19.01.17 в 09:41:21 »
Цитировать | Править

on 18.01.17 в 23:17:46, mine-R wrote:

 
Я не писал, что это "досада"  Smiley
Попробуйте убрать [strip] из алгоритма с переменной, инициализированной в '' и сравните с последним алгоритмом, в котором уже убран [strip].
Мне кажется, будет наглядно видна разница. В первом случае, в начале строки окажется "пробел".
 
А во времена, когда DOS использовался не только как конструктор, можно было к примеру использовать такой прием удаления пятисимвольных слов из конца строки:
 
Code:
A=[ch8]+[ch8]+[ch8]+[ch8]+[ch8]
B='111112222233333'
C=B+A
printstr C

 
Тогда желательно "не путать праведное с грешным". Давайте разделять вопрос работы со строками и вопрос управляющих символов при выводе строк.
 
 
Зарегистрирован
Страниц: 1  Ответить | Уведомлять | Послать Тему | Печатать

« Предыдущая Тема | Следующая Тема »

Powered by YaBB 1 Gold - SP 1.3.2!
Forum software copyright й 2000-2004 Yet another Bulletin Board