![]() |
|
Обрезать строку 8.2 | ☑ | ||
---|---|---|---|---|
0
illiona
naïve
20.06.18
✎
10:49
|
Добрый день. Нужно у строки справа обрезать скобки и что в скобках.
А-церумен ср-во (ЛАБОРАТОРИЯ ЖИЛЬБЕР) -> А-церумен ср-во Авелокс (Bayer AG (рецепт.)) -> Авелокс Амлотоп №30 (амлодипин) (Нижфарм ОАО) -> Амлотоп №30 (амлодипин) Не могу алгоритм придумать. Всем заранее спасибо |
|||
1
butterbean
20.06.18
✎
10:54
|
ты сначала на бумаге задачу как-то опиши, критерии обрезания чтобы были четкие
|
|||
2
vladko
20.06.18
✎
10:58
|
(0) пока вижу алгоритм:
- определяем справа позицию первой открытой скобки и вытираем до конца строки всё что есть. |
|||
3
vladko
20.06.18
✎
11:00
|
+(2)точнее, определяем справа позицию открытой скобки, соответствующей первой закрытой.
|
|||
4
Пес Барбос
20.06.18
✎
11:00
|
я бы через СтрРазделить(<Строка>, "(") сделал.
если (...) начинаются всегда в конце (после нужного наименования) , то первым в массиве будет то, что тебе нужно |
|||
5
vladko
20.06.18
✎
11:04
|
(4) для "Амлотоп №30 (амлодипин) (Нижфарм ОАО)" не сработает, чтобы выдало "Амлотоп №30 (амлодипин)"
|
|||
6
illiona
naïve
20.06.18
✎
11:06
|
да не сработает, вот и думаю сижу как сделать
|
|||
7
Гипервизор
20.06.18
✎
11:06
|
(4) СтрРазделить() в 8.2, ну-ну ))
|
|||
8
Пес Барбос
20.06.18
✎
11:08
|
(5) тогда делать как (2)-(3) через
Сред и СтрНайти (7) мда.. бывает..просто уже и забыл, что есть еще и 8.2 |
|||
9
Гипервизор
20.06.18
✎
11:10
|
(8) И СтрНайти() не покатит по той же причине ))
|
|||
10
vladko
20.06.18
✎
11:11
|
(6) я бы тупо перебирал справа налево позиции символов в строке, чтобы определить нужную мне скобку как в (3) даже в таком случае как в строке "Авелокс (Bayer AG (рецепт.))" считать сколько встретилось закрытых скобок до первой открытой и как только открытых столько же стало, то СТОП и обрезаем до этой позиции.
|
|||
11
novichok79
20.06.18
✎
11:14
|
чего-то тип такого
НоваяСтрока = СтрЗаменить(ИсходнаяСтрока, "(", Символы.ПС); ЧислоСтрок = СтрЧислоСтрок(НоваяСтрока); Если ЧислоСтрок > 2 Тогда Для Счетчик = 1 По ЧислоСтрок - 1 Цикл Результат = Результат + "(" + СтрПолучитьСтроку(НоваяСтрока); КонецЦикла; КонецЕсли; но тогда нужно понять какие скобки нужны, а какие нет |
|||
12
butterbean
20.06.18
✎
11:18
|
(6) проблема то еще видимо в том, что нужно убирать названия производителей в скобках, а название действующего вещества или аналога в скобках оставлять
|
|||
13
FIXXXL
20.06.18
✎
11:21
|
(6) РазложитьСтрокуВМассивПодстрок
|
|||
14
FIXXXL
20.06.18
✎
11:23
|
(13) +
http://helpme1c.ru/razlozhitstrokuvmassivpodstrok-1s-8-3-8-2 если нет в конфе затем обратно собрать, игнорируя последний элемент массива |
|||
15
FIXXXL
20.06.18
✎
11:25
|
по этим Жильберам-Баерам можно массив собрать?
тогда игнорировать подстроки, в которые входит название производителя в общем придумать можно, если есть порядок заведения инфы в названиях... |
|||
16
catena
20.06.18
✎
12:17
|
ВЫБРАТЬ 1 КАК КолСимв
ПОМЕСТИТЬ тзКоличествоСимволов9 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 9 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 0; Выбрать &Строка как Наименование поместить ном; ВЫБРАТЬ тзКоличествоСимволов9_Лев.КолСимв * 10 + тзКоличествоСимволов9_Прав.КолСимв КАК КолСимв ПОМЕСТИТЬ тзКоличествоСимволов100 ИЗ тзКоличествоСимволов9 КАК тзКоличествоСимволов9_Лев, тзКоличествоСимволов9 КАК тзКоличествоСимволов9_Прав; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Различные Номенклатура.Наименование как Наименование, КоличествоСимволовДоОткрытия.КолСимв+1 как Позиция, 1 как сум,"(" как сим Поместить НаимИнтерв ИЗ ном КАК Номенклатура ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволовДоОткрытия ПО Подстрока(Номенклатура.Наименование,КоличествоСимволовДоОткрытия.КолСимв+1,1) = "(" объединить все ВЫБРАТЬ Различные Номенклатура.Наименование, КоличествоСимволовДоЗакрытия.КолСимв+1, -1,")" ИЗ ном КАК Номенклатура ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволовДоЗакрытия ПО Подстрока(Номенклатура.Наименование,КоличествоСимволовДоЗакрытия.КолСимв+1,1) = ")"; Выбрать т1.Наименование,т1.Позиция,т1.сум,Сумма(т2.сум) поместить ПозицияЗакрытия из НаимИнтерв как т1 левое соединение НаимИнтерв как т2 по т1.Позиция<т2.Позиция Сгруппировать по т1.Наименование,т1.Позиция,т1.сум Имеющие Сумма(т2.сум)+т1.сум=0; Выбрать Максимум(т.Наименование),Выразить(Подстрока(Максимум(т.Наименование),1, Максимум(т.Позиция)-1)как строка(100)) результат из ПозицияЗакрытия как т |
|||
17
novichok79
20.06.18
✎
12:46
|
(0) о господи, что это? зачем ради такой задачи делать запрос?
|
|||
18
novichok79
20.06.18
✎
12:47
|
(17) --> (16)
|
|||
19
catena
20.06.18
✎
12:56
|
(17)Потому что, как решать не запросом очевидно - перебрать с конца, найти первое полное закрытие. Я такое еще в универе на паскале делала.
|
|||
20
lodger
20.06.18
✎
13:06
|
(0) держи алгоритм:
1) обходим строчку с конца по одному символу. 2) по ходу движения считаем сколько было значков ")". 3) если нашли "(" и колво из п.п.2 = 1 тогда выходим из цикла, иначе считаем сколько было значков "(". 4) если нашли "(" и колво из п.п.2 сравнялось с колвом из п.п.3 тогда выходим из цикла. 5) обрезаем строку от первого и до значка на котором вышли в п.п.3 или п.п.4. |
|||
21
lodger
20.06.18
✎
13:07
|
+(20) там осталось еще пару доп.условий, но общий смысл думаю ясен.
|
|||
22
catena
20.06.18
✎
13:10
|
(20)Да без если. Заводим счетчик. Если встречаем ")" - счетчик+1, если встречаем "(" - счетчик-1. Как только счетчик в 0, значит это наша позиция обрезания.
|
|||
23
illiona
naïve
20.06.18
✎
13:37
|
МассивСтрок = Новый Массив;
Если СтрЧислоВхождений(Строка,") (") = 1 ТОгда стр = СтрЗаменить(Строка,") (", "&"); Разделитель = "&"; МассивСтрок = РазложитьСтрокуВМассивПодстрок(стр, Разделитель,ПропускатьПустыеСтроки); СтрокаВерная = МассивСтрок[0] + ")"; Иначе МассивСтрок = РазложитьСтрокуВМассивПодстрок(Строка, Разделитель,ПропускатьПустыеСтроки); Если МассивСтрок.Количество()>3 Тогда СтрокаВерная = СокрЛП(МассивСтрок[0]) + " (" + СокрЛП(МассивСтрок[1]); Иначе СтрокаВерная = СокрЛП(МассивСтрок[0]); КонецЕсли; КонецЕсли; Сделала так |
|||
24
novichok79
20.06.18
✎
13:47
|
(19) так и большего не требуется, имхо конечно.
|
|||
25
illiona
naïve
03.07.18
✎
10:35
|
Если СтрЧислоВхождений(Строка,") (") = 1 ТОгда
стр = СтрЗаменить(Строка,") (", "&"); Разделитель = "&"; МассивСтрок = РазложитьСтрокуВМассивПодстрок(стр, Разделитель,ПропускатьПустыеСтроки); СтрокаВерная = МассивСтрок[0] + ")"; ИначеЕсли СтрЧислоВхождений(Строка,") (") = 2 ТОгда стр = СтрЗаменить(Строка,") (", "&"); Разделитель = "&"; МассивСтрок = РазложитьСтрокуВМассивПодстрок(стр, Разделитель,ПропускатьПустыеСтроки); СтрокаВерная = МассивСтрок[0] + ") (" + МассивСтрок[1] + ")"; Иначе МассивСтрок = РазложитьСтрокуВМассивПодстрок(Строка, Разделитель,ПропускатьПустыеСтроки); Если МассивСтрок.Количество()>= 3 Тогда СтрокаВерная = СокрЛП(МассивСтрок[0]) + " (" + СокрЛП(МассивСтрок[1]); Иначе СтрокаВерная = СокрЛП(МассивСтрок[0]); КонецЕсли; КонецЕсли; На всех строках работает кроме Авелокс таб 400мг №5 (Bayer AG (рецепт.)) |
|||
26
illiona
naïve
03.07.18
✎
10:36
|
Авелокс (Bayer AG (рецепт.)) -> Авелокс
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |