powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Критерий-шаблон
8 сообщений из 8, страница 1 из 1
Критерий-шаблон
    #37011517
Фотография Stepler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть: Массив, в основном, текстовой ~33 000 строк (Справочник номенклатуры)
Задача: В ентом массиве куча (по логике) одинаковых значений типа "уголок 50Х50", который могет иметь всемозможные дурацкие варианты: "угол 50х50"
"уголок 50*50"
"уголок50х50"
и т.д. и т.п.
Нужно: Алгоритм решения данной задачи, т.е. как то их отразить как одинаковые - для последующего сведения к единому названию...
НО! Загвозка в том, что я никак не могу придумать алгоритм определения критериальных значений по которым буду искать вариации приведенного выше названия.
Если у кого есть какие либо идеи, подскажите,плз.
Спасибо.


Stepler (щёлк-щёлк!!)

Код: plaintext
 P.S.Чтобы наступила смерть - необходима жизненная сила !!!  
...
Рейтинг: 0 / 0
Критерий-шаблон
    #37011550
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stepler,

в нете валом алгоритмов нечеткого сравнения текста
Берете массив и поочередно сравниваете текущий элемент с остальными элементами.
Там, где % совпадения выше чем X процентов - это фразы сходные.

X определяется эмпирически.

В общем 5 минут кодинга и ждите пока 99 млн записей обработаются формулой.
...
Рейтинг: 0 / 0
Критерий-шаблон
    #37011576
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stepler,

недочитал. Видимо нужно из положим 10 найденных уголоков определить "наиуголкейший"
Ну тут или маску надо придумать, типа перед цифрой пробел, между цифрами звездочка

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

вида

X1X2X3X4Итого суммаX1100%85%78%60%323%X285%100%50%20%255%X378%50%100%10%238%X460%20%10%100%190%
X1 похожее на всех остальных, вот он и "главный"
...
Рейтинг: 0 / 0
Критерий-шаблон
    #37011584
Фотография Stepler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shamanus,

Спасибо, честно говоря, до простого поиска в инете не додумался...
Спасиб исчо раз - буду лазить...
...
Рейтинг: 0 / 0
Критерий-шаблон
    #37011682
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stepler,

если не найдете стучите. У меня где то валялся.
А вообще тут DLL ка на сях реализованная, подключаете в референсах и вуаля.
...
Рейтинг: 0 / 0
Критерий-шаблон
    #37012595
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stepler Есть: Массив, в основном, текстовой ~33 000 строк (Справочник номенклатуры)
Задача: В ентом массиве куча (по логике) одинаковых значений типа "уголок 50Х50", который могет иметь всемозможные дурацкие варианты: "угол 50х50"
"уголок 50*50"
"уголок50х50"
и т.д. и т.п.
Нужно: Алгоритм решения данной задачи, т.е. как то их отразить как одинаковые - для последующего сведения к единому названию...

В качестве стартовой идеи:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
Option Compare Text

' Пример формулы ячейки: =FuzzyReplace(A1;"Угол";50;50;"уголок 50x50")
' Пример VBA-кода: x = FuzzyReplace("уголок50х50", "Угол", 50, 50, "уголок 50x50")
Function FuzzyReplace$(Txt, WordMask$, Size1&, Size2&, Optional Replacement$)
  If Txt Like WordMask & "*" & Size1 & "[*,x,х]" & Size2 Then ' <-- there are English "x" and Russian "х" in []
    If Len(Replacement) >  0  Then
      FuzzyReplace = Replacement
    Else
      FuzzyReplace = WordMask & " " & Size1 & "x" & Size2
    End If
  End If
End Function


Sub Test()
  
  ' Clear the test range
  [a1:c4].ClearContents
  
  ' Cell formula solution
  [A1].Value = "угол 50х50"
  [A2].Value = "уголок 50*50"
  [A3].Value = "уголок50х50"
  [A4].Value = "уголок30х40"
  [B1:B4].Formula = "=FuzzyReplace(A1,""Угол"",50,50,""уголок 50x50"")"
  
  ' VBA code solution
  Dim a(), b$(), r& ' x
  a() = [A1:A4].Value
  For r =  1  To UBound(a)
    a(r,  1 ) = FuzzyReplace(a(r,  1 ), "Угол",  50 ,  50 , "уголок 50x50")
  Next
  [C1:C4].Value = a()
  
End Sub
...
Рейтинг: 0 / 0
Критерий-шаблон
    #37012833
Фотография Stepler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZVI,

Спасибо, но енто не совсем то - могет быть не только "уголок", но и другая номенклатура..

Пока решил так (код не отлажен, просто для пробы - так что не ругайте):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim strStartAddr As String ' Хранит координаты первого найденного _значения
   cvet =  3  'цвет ячейки, исключаем белый и черный
   Var =  1   '№ варианта для отражения в столбце "А"
   Dim rgResult As Range
   'ищем последнюю строку
   ps = Right(ActiveCell.SpecialCells(xlLastCell).Address, Len(ActiveCell.SpecialCells(xlLastCell).Address) -  3 ) +  1 
i =  2 
j =  6 
 
l: If i +  1  >= ps Then GoTo endd
Address = ActiveCell()
 If IsNumeric(Address) = False And IsNumeric(Right(Cells(i, j),  4 )) = False Then
 Address = Cells(i, j)
 End If
' Range(Address).Activate
 If Address = "" Or ActiveCell = "" Then GoTo l1
 strFindData = Address
 Range("a" & ActiveCell.Row) = Var
 P = "h" & ps
   ' Поиск первого входжения искомого слова
   Set rgResult = Range("B2:" & P).Find(strFindData, , xlValues)
   If Not rgResult Is Nothing Then
      ' Сохраним адрес найденной ячейки (чтобы контролировать зацикливание поиска)
      strStartAddr = rgResult.Address
       End If
   Do While Not rgResult Is Nothing
      ' Обработка результата поиска
      rgResult.Select
      If cvet =  57  Then ' если кончались цвета, начинаем заново
      cvet =  3 
      End If
      rgResult.Interior.ColorIndex = cvet ' красим ячейку для нагдядности
Range("a" & rgResult.Row) = Var ' отмечаем № варианта
      ' Новый поиск
      Set rgResult = Range("B2:" & P).FindNext(rgResult)
      If rgResult.Address = strStartAddr Then
            rgResult.Select
      rgResult.Interior.ColorIndex =  2 
Range("a" & rgResult.Row) = ""
             ' Поиск завершен
         Exit Do
      End If
    Loop
   cvet = cvet +  1 
   Var = Var +  1 
l1:
i = i +  1 
   GoTo l
endd:
End Sub
компактные циклы специально не применял для отслеживания, также и выделение ячейки.
с % совпадения - попробывал, не удачно - варианты не всегда отражены мах значением совпадения.

Работает вроде надежно (до конца массива исчо не дошла), но долго.
...
Рейтинг: 0 / 0
Критерий-шаблон
    #37012966
Фотография Stepler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stepler,

Да, забыл показать что примерно получается (прошу учесть, что поиск и сравнение идет по 6-и уровням), естественно, приложенное - тока маленькая часть...
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Критерий-шаблон
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]