|
Вытащить значения из строки | ☑ | ||
---|---|---|---|---|
0
3achem
02.08.19
✎
10:22
|
Доброе утро,
Естьзадача над механизмом которой я думаю несколько дней, а именно Существует сервис, который передаёт строки следующего вида: Комиссия за реализацию товара от 21.05.2019 склад Центральный склад Москва по счету 152356 Комиссия за реализацию товара от 23.05.2019 склад Склад-1 Подольск по счету 124543 Маска такая: Комиссия за реализацию товара от %Дата% склад %НаименованиеСклада% %Город% по счету %НомерСчета% Задача вытащить эти реквизиты (Дата, НаименованиеСклада, Город, НомерСчета) из строки. Всё было бы просто, если бы не сдвоенные реквизиты, а так же то, что изначально в 1С значения реквизита может не быть. Как красиво решить эту задачу? Я думал над справочником шаблонов в котором будет маска (как я написал выше) и ТЗ с параметрами, но дальше не продвинулся. Может в типовой есть где-то пример подобного? Сам я вспомнить не смог |
|||
1
Cyberhawk
02.08.19
✎
10:23
|
РазложитьСтрокуВМассивПодстрок с любым разделителем
|
|||
2
Cyberhawk
02.08.19
✎
10:23
|
Вкупе с ПервоеВхождение... решается элементарно
|
|||
3
АгентБезопасной Нацио
02.08.19
✎
10:34
|
(2) не совсем элементарно надо разобрать неизвестное количество слов в группе НаименованиеСклада-Город.
и наименование склада, и город могут быть из нескольких слов. причем и в названии склада, и в городе слова могут повторяться. типа "первый консигнационный склад нижний новгород нижний новгород" но и это решается ведением списка городов. |
|||
4
Cyberhawk
02.08.19
✎
10:37
|
(3) В общем случае конечно можно все что угодно придумать, что сломает. Но может у чувака в названиях складов нет городов, либо в него всегда слово содержащее "склад" это последнее в названии склада
|
|||
5
3achem
02.08.19
✎
10:38
|
(3) Да, предполагается где-то отдельно хранить города и склады, как раз из-за этой ситуации. Вопрос по механизму остаётся открытым, если это регистр, то в запросе подставлять значение и сравнивать с переданной строкой?
Где лучше и удобнее будет хранить информацию такого рода? (1) (2) Об этом я подумал, но данные надо будет отфильтровать вручную. (4) Изначальное значение параметра для 1С неизвестно |
|||
6
ДядяМитяй
02.08.19
✎
11:02
|
Если есть доступ к правилам формирования входящей строки задача решается просто. Если нет или вообще нет таких правил (баба Маша пишет от руки все, что вздумается) - задача не решается совсем (разве что с помощью ИИ).
|
|||
7
3achem
02.08.19
✎
11:07
|
(6) Правила есть, маска, которую я написал, от руки ничего не заполняется. То есть известно как будет выглядеть строка, но неизвестен список параметров (его нужно как-то копить в 1С)
|
|||
8
Кирпич
02.08.19
✎
11:27
|
(0) Вообще, это задача для регулярных выражений. А так, будь мужиком, потрать полчаса на маленькую функцию. Используй СтрНайти("от ") СтрНайти("склад ") СтрНайти("по счету ")
|
|||
9
ДядяМитяй
02.08.19
✎
11:27
|
а есть возможность изменить маску? надо добавить разделитель между следующими подряд параметрами (например / ) и все упростится
|
|||
10
SpitfireIX
02.08.19
✎
12:07
|
Я решал через регулярные выражения. Смысл в том, что между словами всегда есть якоря типа "товара от %Дата% склад". В случае с "склад %НаименованиеСклада% %Город% по счету", ищется слово "по счету" и слово от 2х пробелов назад до слова по счету считается городом.
Если интересно, то могу попробовать найти регулярку, ближе к вечеру. |
|||
11
SpitfireIX
02.08.19
✎
12:08
|
А, сори, тупанул, там жеж еще склад, тоже может быть с пробелом.
|
|||
12
AlvlSpb
02.08.19
✎
12:13
|
(0) Какого реквизита может не быть? Судя по строке, запись или есть и в полном объеме или ее е существует
|
|||
13
3achem
02.08.19
✎
12:17
|
(9) Изменить маску возможности нет, я подумал о чтении строки в обратном порядке и есть идея с перебором уже записанных значений
(12) Здесь имеется в виду, что может придти название склада, которого в 1С нет (то есть его надо будет создать, для этого и идёт сбор параметров) Если бы весь список значений параметров был бы известен, то задача решалась бы намного проще (без ручного вмешательства) |
|||
14
Консультант Баранов
02.08.19
✎
12:21
|
(0) > Существует сервис, который передаёт строки следующего вида:
1. А нельзя у сервиса попросить выгружать Комиссия за реализацию товара от 21.05.2019 склад Центральный склад город-герой Москва по счету 152356 2. Второе слово у склада наверняка будет со строчной буквы. Считать начало города с первого слова после склада с Заглавной буквы. |
|||
15
AlvlSpb
02.08.19
✎
12:24
|
(13) Я бы попытался сделать комбинацией из средств языка 1С и регулярки.
1. Отсекаем известное и не нужное "Комиссия за реализацию товара от " 2. После этого Дата вычленяется легко Лев строка и кол-во знаков 3. Регуляркой ищем вхождение заглавных букв, если 2, то есть и склад и город 4. Найти позицию каждой заглавной. С первой позиции до второй - склад, со второй до "по счету" город 5. номер счета тоже просто выделяется |
|||
16
vova1122
02.08.19
✎
12:37
|
(15) Поправка.
1. Отсечь "Комиссия за реализацию товара от " 2. Найти "по счету" и все что после него -это номер счета 3. Взять левое от найденой позиции "номер счета" 4. Теперь нам остается в строкн только Склад Город 5. Город всегда одно слово справа (или может быть исключения?) 6. Остальное - название склада |
|||
17
unregistered
02.08.19
✎
12:38
|
Не совсем понял в чем проблема.
Комиссия за реализацию товара от %Дата% склад %НаименованиеСклада% %Город% по счету %НомерСчета%. Дата - вычисляется легко - 10 знаков после "Комиссия за реализацию товара от ". Счет - символы от последнего пробела и до конца строки. НаименованиеСклада и Город - самая сложная часть. Сначала получаем эту часть целиком, которая находится между первым вхождением слова "склад" и словосочетанием "по счету". Потом пытаемся откусить Город. Это одно или два (Нижний Новгород, Великий Новгород) последних слова. Оставшееся - это Склад. И плевать - есть там в этой стоке город или нет. |
|||
18
unregistered
02.08.19
✎
12:40
|
(16) >> Город всегда одно слово справа (или может быть исключения?).
Бывают исключения )))) Великий Новгород, Нижний Новгород, New Васюки,... Городов, состоящих из нескольких слов дофига. |
|||
19
vova1122
02.08.19
✎
12:42
|
(18) вот тут маленькая засада с городами. Хотя можно сделать список таких городов
|
|||
20
unregistered
02.08.19
✎
12:44
|
Список городов можно взять в базе КЛАДРа (не помню как он там сейчас называется по-модному).
|
|||
21
SpitfireIX
02.08.19
✎
13:10
|
А %Склад% - это наименование склада из этой базы? Если да, то если предположить что склады в базе всегда есть, то можно взять пару "%Город% %Склад%", найти ссылку на склад, и потом удалить из строки его наименование, а все что осталось - это уже город.
|
|||
22
3achem
02.08.19
✎
13:25
|
(21) Склада может не быть в базе и нужно будет его создать
(15) (16) (17) Остановился на таком варианте А теперь усложним задачу - механизм должен быть универсальный под несколько масок |
|||
23
АгентБезопасной Нацио
02.08.19
✎
13:51
|
(14) разделять ";" (хотя бы склад и город), или писать слово "город" - и все сводится к элементарщине.
(17) ага, именно так. |
|||
24
vova1122
02.08.19
✎
14:11
|
(22) полнотю универсальным никогда не сделаете. Ну а если известны все маски то определить по какой именно из этих масок создана строка не составит труда - тупо проверить на известные слова в строке в нужном порядке следования
|
|||
25
3achem
03.08.19
✎
17:42
|
(24) (23) Я сделал, для полной универсальности не реализовал ситуацию, когда среди любого количества [1..n] параметров в подряд, есть то, которое не обращается к поиску в таблицах (регистрах и т.д.). Но над этим подумаю в понедельник.
Всем спасибо! |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |