Имя: Пароль:
1C
 
Авторазбивка на характеристики при загрузке номенклатуры
0 Zhuravlik
 
10.10.14
10:35
Добрый день. Вопрос меня мучает уже несколько дней, но он скорее праздного характера.
Дело вот в чем. Недавно писал обработку для загрузки данных из внешних файлов. Файлов было оч. много, поэтому запилил универсальную нетленку - все ОК. Стал проводить нагрузочное тестирование, всего около 20 контров, по каждому взял 4 файла с последних выгрузок, и обратил внимание на вот такие позиции (например):
Диваж Лак Party Style,т03
Диваж Лак Party Style,т06
Диваж Лак Party Style,т07
...
Диваж Лак Party Style,т13

или
Диваж Тушь д/ресниц 90*60*90 Luxurious Lashes т.02 корич
Диваж Тушь д/ресниц 90*60*90 Ultra Curly т.9702
Диваж Тушь д/ресниц 90*60*90 Maxi синяя т.9102

В глаза сразу бросается: "Диваж Лак Party Style" - это номенклатура, а "т03", "т06", "т07" и проч. - это характеристики.
Я не могу понять, по какому алгоритму можно получить такую информацию?
Повторюсь, что это просто мне интересно, я понимаю что подобный алгоритм наверняка не будет 100% жизнеспособным, но уверен что существуют (и скорее всего где-то используются) подобные разработки.
1 Anarki
 
10.10.14
10:47
Ты про то как распарсить или чиво?
2 Zhuravlik
 
10.10.14
10:50
Я про то, как из массива, типа

Диваж Лак Party Style,т03
Диваж Лак Party Style,т06
Диваж Лак Party Style,т07
...
Диваж Лак Party Style,т13

...

Диваж Тушь д/ресниц 90*60*90 Luxurious Lashes т.02 корич
Диваж Тушь д/ресниц 90*60*90 Ultra Curly т.9702
Диваж Тушь д/ресниц 90*60*90 Maxi синяя т.9102

Получить дерево:
Диваж Лак Party Style
------------------------- т03
------------------------- т06
------------------------- т07
...
------------------------- т13

Диваж Тушь д/ресниц 90*60*90
------------------------- Luxurious Lashes т.02 корич
------------------------- Ultra Curly т.9702
------------------------- Maxi синяя т.9102

Количество элементов в массиве, и количество символов в каждом элементе заранее неизвестны.
Как-то так. Даже сформулировать по-человечески не получается)
3 Zhuravlik
 
10.10.14
10:52
Блин, чем больше думаю, тем меньше понимаю, уже башка болит) Словно какая-то навязчивая мелодия.
4 Zhuravlik
 
10.10.14
11:01
Можно идя по строкам раскладывать каждую на слова, используя пробел в качестве разделителя. Посмотреть, на максимальное количество слов, и создать матрицу (таблицу значений) с размерностю "Максимальное количество слов по строке" x "Количество элементов в массиве". Потом ее заполнить соотв. данными, и отсортировать по подряд идущим колонкам. После этого я буду знать, что сходные элементы идут подряд друг за другом.
Как их после этого между собой сравнивать? Как понять, что в словах "Диваж Лак Party Style,т03", "Диваж Лак Party Style,т06", "Диваж Лак Party Style,т07" есть одна максимально общая (не знаю как точнее сказать) позиция "Диваж Лак Party Style"?
Если вот этот момент понять, то тогда в принципе ясно как дальше решить такую задачку.
Сдается мне тут какой-то матан, и наверняка не особо дикий.
5 AlekseyMista
 
10.10.14
11:01
Не обязательно это характеристики: важно у юзера узнать как он хочет видеть свои печатные документы и отчеты. Если со всеми циферками, то надо оставлять как есть: представь сформирует он ОСВ, а там не понятно каких Диваж Лак Party Style у него сколько осталось...
6 Anarki
 
10.10.14
11:03
Ну я это и написал.
НУ, например, можно каждую строчку разбить на слова и весь файл запихнуть в ТЗ, где одна строка это одна строка из файла и в одном поле хранится одно слово. Все одинаковые товары будут находится рядом в ТЗ и отличатся будут последними словами, например в твоем примере наименование состоит из 4 слов (словами считать все), все остальное будем считать характеристиками. Ну типо того.
7 Anarki
 
10.10.14
11:04
(6)пока писал ты почти тоже самое написал в (4)
8 Anarki
 
10.10.14
11:06
Смысл только в том из скольких слов программа должна считать наименование, для этого перед тем как грузить файл, нужно привести к какому то одному более менее единообразному виду.
9 AlekseyMista
 
10.10.14
11:07
А алгоритм достаточно прост: загоняешь все в тз, у которой в отдельных колонках лежат буквы названия. Дальше в цикле по колонкам с конца делаешь копию таблицы и сворачиваешь по колонкам до текущей и смотрешишь какие строки свернулись. Уменьшаешь количество сворачиваемых колонок на 1 и смотришь: если опять свернулись теже строки, то надо опять тестировать, уменьшая количество колонок на 1.

Преимущество этого алгоритма в том, что разбивка по буквам происходит один раз перед циклом.
10 AlekseyMista
 
10.10.14
11:10
(6) ну лежат они рядом, но ведь могут быть два похожих наименования, образующих ДВЕ разные номенклатуры. Где критерий, что это ОДНА номенклатура? в (9) этот критерий существует: при убавлении последней буквы свернулись ТЕ ЖЕ строки...
11 Anarki
 
10.10.14
11:12
(9)
При твоем алгоритме строчки

"Диваж Лак Party Style,т03",
"Диваж Лак Party Style,т06",
"Диваж Лак Party Style,т07"

загрузятся как
Диваж Лак Party Style,т0
                      -3
                      -6
                      -7
12 Anarki
 
10.10.14
11:12
По словам надо сворачивать
13 Zhuravlik
 
10.10.14
11:50
(9) Думаю, слишком долго, будет непроизводительно. Алгоритм должен быть проще.
(11) Да, кстати, получается что пробел не катит в качестве универсального разделителя.
строку Диваж Лак Party Style,т03 считает неверно. Выходит, нужен еще некий массив возможных разделителей, и парсинг делать в несколько вариантов, проставлять некие веса, от них выбирать какой наиболее вероятный... Чот жестко)
14 Zhuravlik
 
10.10.14
11:52
Каждую строку нужно сравнивать со всей таблицей, проставлять ей вес (некий % подобия), потом сворачивать по этому коэффициенту, и мот быть будет щасье. На выходных поморочусь)
15 Zhuravlik
 
10.10.14
11:53
"Каждую строку нужно сравнивать со всей таблицей", - имеется в виду каждую строку нужно сравнивать со всеми прочими строками таблицы
2 + 2 = 3.9999999999999999999999999999999...