Вход | Регистрация



Самый красивый код для задачи - распознать ГТД и страну из строки

Самый красивый код для задачи - распознать ГТД и страну из строки
Я
   Maniac
 
10.11.18 - 22:42
Имеем типичную накладную из 1С - печатная форма стандартная которая лепит в наименование ГТД и страну в конец наименования.

Задача - из этих самых наименований
а) убрать нафиг эти ГТД и страны оставив чистым наименование
б) Распознать ГТД
в) Распознать страну.

Три не сложных алгоритма. Я у себя решил, но чота не нравится..
Чую как то можно красивее!! Так чтобы глаз радовался коду.

Вот такие наименования в накладной


Корпус системного блока ПК ZALMAN Z1 NEO Mid Tower, ATX, USB3.0 (10702070/130618/0078002/1, КИТАЙ)            
Корпус системного блока ПК ZALMAN Z3 PLUS Black Mid Tower, ATX, USB3.0, 120mm Fan x4, fan controller, видео карты до 360мм, SSD support, Arcilic side panel, black color (10702070/160418/0046291/1, КИТАЙ)
 
 
   Maniac
 
1 - 10.11.18 - 22:42
Еще также могут быть наименования, в которых несколько раз встречаются скобки
Активная акустическая система MICROLAB М-109 черные (10W RMS) (10702070/010618/0072070/7, КИТАЙ)
   Maniac
 
2 - 10.11.18 - 22:44
Сейчас в меня 
а) 4 строки кода
б) 11 строк кода
в) 9 строк кода.
   Полбатона
 
3 - 10.11.18 - 23:27
Напиши на ИС, там 100% помогут.
   Maniac
 
4 - 10.11.18 - 23:29
Тут лучше форум чем ИС. Это раз.
   МихаилМ
 
5 - 10.11.18 - 23:57
мыслите множествами - нужно обработать множество строк , а не одну.  и алгоритмы будут другими.
   Maniac
 
6 - 11.11.18 - 00:05
Все я нашел лучший варианты!!!...

а) 4 строки
б) 4 строки
в) 3 строки!!!
   Maniac
 
7 - 11.11.18 - 00:09
В общем я решил задачу два раза по три алгоритма.
В последнем варианте получились самые короткие и наверное более универсальные чем в первом.
Решайте теперь вы. Я свои варианты предоставлю (они уже опубликованы)
   МихаилМ
 
8 - 11.11.18 - 00:11
стиль шизойда фиксина - давать загадки без решения   - дурной.
   Maniac
 
9 - 11.11.18 - 00:13
А смысл тогда темы было заводить если бы были решения.
Должна сработать соображаловка. Кому не лень тот учавствует в конкурсе. Кому лень - ну так проходите мимо или зайдете когда тут люди напишут.
   Maniac
 
10 - 11.11.18 - 00:14
Я когда писал тему у меня были варианты которые мне не нравились. Писать их - это значило бы начатьб обсуждать их.
А наоборот хочу увидеть варианты решений которые кому прийдут в голову.
Но потом я сам посидел и нашел скорее всего лучший варианты.

Но я потом все напишу.
 
 Рекламное место пустует
   zak555
 
11 - 11.11.18 - 00:26
Давно в наименования гтд лепятся?

И я не помню, чтобы гтд было в торг
   Aleksey
 
12 - 11.11.18 - 00:28
(11) Да уже много лет ут так делает
   Maniac
 
13 - 11.11.18 - 00:28
Практически во всех старых конфигурациях
   Asmody
 
14 - 11.11.18 - 00:29
(0) Если оно всегда в последних скобках и разделено запятой,то решается одной регуляркой https://regex101.com/r/w8GzJY/2
   zak555
 
15 - 11.11.18 - 00:32
(12) ааа

Это наверное серия?
   Aleksey
 
16 - 11.11.18 - 00:32
(7) А судьи кто? Кто сказал что твой алгоритм рабочий универсальный?

(9) А что объявлен конкурс? Конкурс это когда есть экспертное жюри или голосование. А это тянет максимум на соревнование
   Maniac
 
17 - 11.11.18 - 00:33
Ладно короче чтобы уже флуд закончился начну с первой задачи

ЗАДАЧА 1 - получить чистое наименование.
ВАРИАНТ 1

НайтиСкобку = СтрНайти(Значение, "(",НаправлениеПоиска.СКонца);
Если НайтиСкобку > 0 Тогда
Значение = Лев(Значение,НайтиСкобку-1);
КонецЕсли;

ВАРИАНТ 2

МассивВсехСлов = СтрРазделить(Колонка3," ");
МассивВсехСлов.Удалить(МассивВсехСлов.Количество()-1);
МассивВсехСлов.Удалить(МассивВсехСлов.Количество()-1);
Значение = СтрСоединить(МассивВсехСлов," ");
   Maniac
 
18 - 11.11.18 - 00:34
ЗАДАЧА 2 - получить ГТД

ВАРИАНТ 1

НайтиСкобку = СтрНайти(Значение, "(",НаправлениеПоиска.СКонца);
Если НайтиСкобку > 0 Тогда
Значение = Прав(Значение,СтрДлина(Значение)-НайтиСкобку);
Значение = СтрЗаменить(Значение,"(","");     
Значение = СтрЗаменить(Значение,")","");

НайтиЗапятую = СтрНайти(Значение, ",");
Если НайтиЗапятую > 0 Тогда
Значение = Лев(Значение,НайтиЗапятую-1);
КонецЕсли;
КонецЕсли;


ВАРИАНТ 2

МассивВсехСлов = СтрРазделить(Колонка3," ");
ПредпоследнееСлово = МассивВсехСлов.Получить(МассивВсехСлов.Количество()-2);
Значение = СтрЗаменить(ПредпоследнееСлово,"(","");
Значение = СтрЗаменить(Значение,",","");


Ну а третью задачу про страну не вижу смысла писать. Практически тоже самое.
   Aleksey
 
19 - 11.11.18 - 00:34
(14) код не рабочий
   Aleksey
 
20 - 11.11.18 - 00:36
(18) Аналогично, не универсальный
   Asmody
 
21 - 11.11.18 - 00:38
(19) Ты гонишь, у меня всё работает.
   Maniac
 
22 - 11.11.18 - 00:39
(20) через массивы и методом стрразделить - все универсально проходит. И с очень коротким кодом.
   Aleksey
 
23 - 11.11.18 - 00:39
(21) В номере ГТД, внезапно, могут быть символы, а твой код этого не допускает.
Плюс длина номера не фиксированная
   Aleksey
 
24 - 11.11.18 - 00:40
(22) Внезапно, некоторые страны могут содержать скобки в имени, хочешь сказать твой код корректно их обработает?
   Asmody
 
25 - 11.11.18 - 00:40
(23) Все представленные (0) тесты регулярка прошла.
   Maniac
 
26 - 11.11.18 - 00:40
(14) а что это за сайт такой?
Это как то можно в 1С использовать без кода 1С?
И без обращения к каким то сайтам.
   Aleksey
 
27 - 11.11.18 - 00:41
(25) Я же говорю правила какие. Мы ищем универсальный механизм? Или конкретно работает с 2-мя тестовыми примерами?
   Maniac
 
28 - 11.11.18 - 00:44
(27) он все правильно описал. Всегда в конце, скобки и запятая.
   Aleksey
 
29 - 11.11.18 - 00:46
(28) У меня по скобкам нет вопроса к его коду, у меня вопрос по символам. Т.е. если в номере ГТД будут символы, его код этот номер пропустит, так как он будет в неформате.
   Asmody
 
30 - 11.11.18 - 00:51
(27) Кто сказал, что задачу надо решать на 1С? Хотя, можно и в 1С регулярки пускать. Я знаю три, нет, четыре способа для этого. Или даже пять, если с извращениями.
   Cthulhu
 
31 - 11.11.18 - 00:52
Корпус системного блока ПК ZALMAN Z3 PLUS Black Mid Tower, ATX, USB3.0, 120mm Fan x4, fan controller, видео карты до 360мм, SSD support, Arcilic side panel, black color (10702070/160418/0046291/1(2), КИТАЙ)
   Asmody
 
32 - 11.11.18 - 00:52
(30) в (26)
   Maniac
 
33 - 11.11.18 - 00:52
Вы скажите теперь как в 1С можно использовать регулярные выражения на иных языках, но чтобы без обращения к интернету и без всяких КОМ- объектов.

И чтобы работало быстро если например 100 000 строк обрабатывается.
 
 
   Maniac
 
34 - 11.11.18 - 00:54
И так чтобы работало на серверной 1С даже если сервак на линуксе.
   Asmody
 
35 - 11.11.18 - 00:54
(27) мы ищем способ решить задачу в (0). В ней даны конкретные тест-кейсы. Про формат ГТД в ней ничего нет. Про формат названий страны тоже.
   Aleksey
 
36 - 11.11.18 - 00:55
(31) А в жизни такой номер ГТД бывает?
- "1(2)" - это номер позиции в декларации.
Т.е. у тебя один и тот же товар (Корпус системного блока ПК...) в таможенной декларации отражен двумя строками?
   Asmody
 
37 - 11.11.18 - 00:56
(33) это разовая задача или постоянная?
   Maniac
 
38 - 11.11.18 - 00:56
Асмоди решил задачу в ноль!
Все остальное фигня. Нет в том файле другого. Было бы я бы сразу описал. Если будут - то это уже другой вопрос.
Настраивается конкретный файл.
Если будут другие - у них свои будут алгоритмы.

Тут главное принцип. Принцип ясен.
   Aleksey
 
39 - 11.11.18 - 00:57
(35) Ну я думаю у автора все таки вопрос стоит несколько шире, а то можно докатиться до того что
если найти ("КИТАЙ") тогда - и такой код тоже формально будет решать тестовый пример
   Maniac
 
40 - 11.11.18 - 00:58
(37) с регулярками? вообще постоянно!
С чем попало. То то то се. Пишу все на 1С.
Все получается.
Но добавить еще регулярные на других языках - тоже было бы круто!!!
Не все владеют 1С.
   Asmody
 
41 - 11.11.18 - 00:58
Для разовой я бы выгрузил в текст и прошелся бы скриптом на питоне.
Для постоянной поднял бы сервис и дергал бы при необходимости.
   Aleksey
 
42 - 11.11.18 - 00:59
(38) Ну ок, я тебя предупредил что его код не универсальный, что в жизни всё гораздо сложнее. Но если тебя устроит решение конкретно твоего тестового примера, то кто я такой, чтобы тут указывать тебе?
   Maniac
 
43 - 11.11.18 - 00:59
Вот например я еще задачу решал час назад....

Добрый день.
У поставщика наименование имеет вид Холодильник {много текста} Индезит
Какой алгоритм, чтобы было
Холодильник Индезит {много текста}


Поставить последнее слово после первого

МассивВсехСлов = СтрРазделить(Значение," ");
ПоследнееСлово = МассивВсехСлов.Получить(МассивВсехСлов.Количество()-1);
МассивВсехСлов.Удалить(МассивВсехСлов.Количество()-1);
МассивВсехСлов.Вставить(1,ПоследнееСлово);

Значение = СтрСоединить(МассивВсехСлов," ");
   Cthulhu
 
44 - 11.11.18 - 00:59
(36): а в номере гтд и стране происхождения - не может быть скобок (даже проще - открывающей скобки)? только в этом случае алгоритм, построенный на поиске "открывающей скобки" с конца (в качестве начала постфикса с номером гтд и страной)работоспособен...
   zak555
 
45 - 11.11.18 - 01:00
а вот перешли бы на упд или xml и проблем не было
   Aleksey
 
46 - 11.11.18 - 01:01
(44) В номере нет, а в стране да. Открой классификатор стран мира
   Maniac
 
49 - 11.11.18 - 01:07
(42) пилять) вы мне скажите как к 1С прикрутить эти регулярки на других языках, чтобы работало во всех режимах.

Компонента может какая или что...

И насколько быстрее это может работать чем код 1С (например тот что я привел)
 
 Рекламное место пустует
   Asmody
 
51 - 11.11.18 - 01:15
У Орефкова была ВК, которая цепляла библиотеку из состава 8ки
https://snegopat.ru/scripts/doc/trunk/rex/readme.markdown
.
   Aleksey
 
52 - 11.11.18 - 01:17
По коду Asmody
Там всего лишь нужно добавить 2 символа Пп и тогда в первом приближение вопросов нет.
   Maniac
 
53 - 11.11.18 - 01:18
Понятно что ничего не понятно. Завтра своему корешу дам задание изучить вопрос (он питонщик) и если нужно сделать нативную компоненту для восьмерки, работающую везде.

Главное понять, насколько это будет быстро и функционально по сравнению с 1С. Я так понимаю это будет проще тем кто на 1С не совсем кодит или не нравится кодить.
   Garykom
 
54 - 11.11.18 - 01:35
Маня и тебя стукнула задачка над которой я страдал еще в 2014?
Алгоритм нахождения подстрок в строке
   Garykom
 
55 - 11.11.18 - 01:36
Для выделения ГТД можно использовать их формат http://www.tehreg.ru/vopr_gtd.htm

Для выделения страны можно использовать справочник стран, логично?
   Maniac
 
56 - 11.11.18 - 01:45
Что значит стукнула. я 19 лет в 1С кодю и справляюсь с ее языком. эта вся дребень у меня началась с 2008 года
   Maniac
 
57 - 11.11.18 - 01:47
(55) это уже все после строковых разложений
   Maniac
 
58 - 11.11.18 - 01:50
в тех проблемах что обычно в1С  практически всегда не бывает ничего просто. регулярные выражения на питоне скорее всего лишь малая часть. кодом 1С можно закрыть практически все что связано со строами...
как минимум инструментарий в платформе есть и становится шире.
   Garykom
 
59 - 11.11.18 - 01:51
(57) Зачем после "строковых разложений", когда можно сразу и вместо?

Пойми что чуть поменялся формат и решение через поиск ГТД и страны в тексте будет работать даже если скобок нет или местами переставят ГТД и страну.

А твое решение нифига не универсальное и для другого поставщика/прайса тупо не заработает.
   Maniac
 
60 - 11.11.18 - 01:52
меня просто смущает то что массивы надо шлепать. поэтому я и привел примеры.

где в одних тупо через символы пасковыриваю. в другом через массивы и разложения.

...хотя.... этож накладные а в накладных не бывает тысяч строк... любой код этот в затратах секунды работать будет.

как новорится не нужно усложнять там где оно нафиг не нада.
   Maniac
 
61 - 11.11.18 - 01:53
(59) будет другой будет пища. вот тогда нужно будет или улучшать и упиверсализировать. либо тупо другому подправить и все.
   Garykom
 
62 - 11.11.18 - 01:54
(61) Задолбаешься подправлять (лично я так сразу) когда форматов наименований разных штук под 40 и все новые появляются с новыми поставщиками а старые уходят.
   Maniac
 
63 - 11.11.18 - 01:55
у меня один фиг это все справочник. из которого под конкретный прайс выбираются наборы выражений.

жто не является соновным кодом обработки.
   Garykom
 
64 - 11.11.18 - 01:56
(62)+ Я у себя сделал обучение обработки юзером, он тупо выделяет новые (не распознаваемые еще) примеры подстрок и говорит к какому классу они относятся.

И далее оно само распознается - пример машинного обучения ))
   Maniac
 
65 - 11.11.18 - 01:57
(62) пофиг. я каждому составляю то что ему нужно. в рамках поддержки. еще и немного платят. все универсализировать невозможно. говорю это как тот кто все схавал уже за 10 лет.

работы всегда будет во всем.
справочник и все.
   Garykom
 
66 - 11.11.18 - 02:04
Хочешь сказать тебя не попросили выделять/разделять
"Корпус системного блока ПК" и "Активная акустическая система" с сопоставлением со своими названиями групп/разделов?
   Garykom
 
67 - 11.11.18 - 02:16
"10702070/130618/0078002/1" - это шаблон поиска с "Ч" (число) и ключевыми символами "/"

"ЧЧЧЧЧЧЧЧ/ЧЧЧЧЧЧ/ЧЧЧЧЧЧЧ/Ч" или "ЧЧЧЧЧЧЧЧ/ЧЧЧЧЧЧ/ЧЧЧЧЧЧЧ/ЧЧ"
   Aleksey
 
68 - 11.11.18 - 03:09
(67)
Первые 8 Ч необязательно, бывает и  не форматы (когда растоможкой занимаются страны ТС) бывают и наши ставят меньше 8. Короче там может быть от 3 до 8 Ч

Вторые Ч в идеале желательно проверять на корректность, чтобы отсекать совсем левые ГТД (например будущей датой или некорректные цифры при распознавании)

У третей группы Ч допускается первый символ П, так называемая предварительная декларация. Зачастую её меняют на окончательную, но иногда (если ошибок в предварительной нет) выпускают и по предварительной, с буквой П вначале (возможно сейчас еще какие то буквы, но по крайне мере лет 5 назад было такое)

Четвертая палка не обязательный реквизит, т.е. его может и не быть, но чисто теоретически в рамках одной декларации может быть до 100 товаров включительно. (1 товар на первом листе, остальные на добавочном. При этом на добавочном до 3-х товара и количество добавочных листов ограничено 33. Итого 33*3+1 = 100 товара). Больше только в разных декларациях. Короче возможен вариант и ЧЧЧ - конечно такой вариант крайне мал, но раз в год и палка стреляет
   Aleksey
 
69 - 11.11.18 - 03:18
О даже в декабре прошлого года были изменения (Решение Коллегии Евразийской экономической комиссии от 13.12.2017 N 171) и теперь в 3 группе возможно 9 символов.

элемент 3 - порядковый номер заявления, присваиваемый по журналу регистрации заявлений таможенным органом, зарегистрировавшим заявление, начинающийся с буквенных символов «ЗВ» (нумерация начинается каждый календарный год с 1).

Т.е. в 3 группе возможны варианты 
"ЗВЧЧЧЧЧЧЧ" или "ПЧЧЧЧЧЧЧ" или "ЧЧЧЧЧЧЧ"
   Garykom
 
70 - 11.11.18 - 19:57
(69) Угу просто несколько шаблонов слегка отличающихся, добавить новый при новых данных не проблема и код переписывать не надо.
   Лефмихалыч
 
71 - 11.11.18 - 21:02
ГТД - это последовательность XXX/YYY/ZZZ, у которой
XXX - это один из вот этих кодов http://www.tamognia.ru/qualifiers/qualifier_22.php
YYY - это дата в формате ДДММГГ
ZZZ - длинное целое

страна - закрытый классификатор ОКСМ

по этим признакам находим сначала ГТД, потом все, что после прогоняем через ОКСМ. Потом вырезаем это все к херам из наименования, потом удаляем скобки, внутри которых ничего, кроме пробелов и знаков препинания.
Оставшееся - сокрэлпим.

Это - если строго.
Если по-сельскохозяйственному, то тупо регуляркой ищем "(ГТД что_угодно)", ломаем по месту пробела и слева - ГТД, справа - страна.
   Лефмихалыч
 
72 - 11.11.18 - 21:05
но в любом случае понадобится руками контролировать. Потому, что страну могут написать, как попало, скобку могут не открыть или не закрыть и т.д.
   Aleksey
 
73 - 11.11.18 - 21:21
(72) Эта шаблон.
Т.е. 1С-ка в поле наименовании товара пихает наименование + (Номер ГТД, Страна)
Т.е. никто руками эту строку не пишет, это 1С-ка так выпендрилась (видать кто то на упрощенки попросил, так как фактуры нет, и поэтому нет ГТД и страны)
   Лефмихалыч
 
74 - 11.11.18 - 21:30
(73) тогда сельскохозяйственный метод - самое оно
   МимохожийОднако
 
75 - 11.11.18 - 22:06
(0)ОФФ:Запахло Гением 1С.
   Maniac
 
76 - 12.11.18 - 09:07
(75) я в том числе и гений в 1С
   FIXXXL
 
77 - 12.11.18 - 09:21
Маня открыл для себя СтрРазделить :)
   tgu82
 
78 - 12.11.18 - 09:21
(0) Ну это то же самое как в наименовании кабельного товара есть ПУГНП/ПУГВП/ПУГСП/ВВГпг 2*4 провод и надо убрать в ценнике эти ПУГНП/ПУГВП/ПУГСП. Как-то давно сделал убирается даже если скобки есть
   Maniac
 
79 - 12.11.18 - 09:22
Кстати распознать формат типа XXX/YYY/ZZZ в 1С тоже достаточно легко языком написать


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует