Здравствуёйте! Опять требуется помощь... Подобные задачи уже, наверняка,были,но притулить то, что было найдено для своей цели не получается. Нужно, чтобы данные извлекались из базы по совпадению части или целой строки, содержащей выбранный текст (В файле понятней) Спасибо!
Здравствуёйте! Опять требуется помощь... Подобные задачи уже, наверняка,были,но притулить то, что было найдено для своей цели не получается. Нужно, чтобы данные извлекались из базы по совпадению части или целой строки, содержащей выбранный текст (В файле понятней) Спасибо!pechkin
pechkin, для начала определитесь с правилами обработки. Это сэкономит Вам много сил впоследствии. Например, уже есть одно правило - тип счётчика должен выбираться не по конкретной модели, а по общему типу или фирме-производителю. Определитесь какие ещё могут быть требования и варианты по другим полям, поскольку набор правил может здорово повлиять на окончательный способ анализа.
pechkin, для начала определитесь с правилами обработки. Это сэкономит Вам много сил впоследствии. Например, уже есть одно правило - тип счётчика должен выбираться не по конкретной модели, а по общему типу или фирме-производителю. Определитесь какие ещё могут быть требования и варианты по другим полям, поскольку набор правил может здорово повлиять на окончательный способ анализа.Skif-F
'Анализ двух строк на подобие 'Вход: ' String1, String2 - сравниваемые строки 'Результат: ' число от 0 до 1, определяющее степень схожести двух строк Public Function Simil2(ByVal String1 As String, ByVal String2 As String) As Double Dim l1 As Integer, l2 As Integer 'Количества слов в каждой строке Dim n As Integer 'Счётчик цикла Dim st1 As Variant 'Массив слов строки String1
String1 = UCase(String1): String2 = UCase(String2) 'Приводим строки к одному виду If String1 = String2 Then Simil2 = 1 Else st1 = Split(String1, " ") 'Разбиваем String1 на слова l1 = UBound(st1) 'Получаем количество слов в строке String1 l2 = UBound(Split(String2, " ")) 'Получаем количество слов в строке String2 String2 = " " + String2 + " " If l1 > 0 And l2 > 0 Then 'Должно быть хотя бы по одному слову в каждой строке For n = 0 To l1 'Перебираем все слова в строке String1 If InStr(1, String2, st1(n), vbTextCompare) > 0 Then 'Проверяем их наличие в строке String2 Simil2 = Simil2 + 1 'Считаем количество найденных слов End If Next n Simil2 = Simil2 / (l1 + l2) 'Считаем коэффициент Else Simil2 = 0 End If End If End Function
[/vba] Для лучшей точности определения совпадения строк лучше выполнять вызов дважды, меняя местами операнды: [vba]
Код
d1 = Simil2(Строка1, Строка2) + _ Simil2(Строка2, Строка1) If d1 > 0.45 Then
[/vba] где 0,45 - пороговое значение - подбирается экспериментально
Могу предложить такую функцию: [vba]
Код
'Анализ двух строк на подобие 'Вход: ' String1, String2 - сравниваемые строки 'Результат: ' число от 0 до 1, определяющее степень схожести двух строк Public Function Simil2(ByVal String1 As String, ByVal String2 As String) As Double Dim l1 As Integer, l2 As Integer 'Количества слов в каждой строке Dim n As Integer 'Счётчик цикла Dim st1 As Variant 'Массив слов строки String1
String1 = UCase(String1): String2 = UCase(String2) 'Приводим строки к одному виду If String1 = String2 Then Simil2 = 1 Else st1 = Split(String1, " ") 'Разбиваем String1 на слова l1 = UBound(st1) 'Получаем количество слов в строке String1 l2 = UBound(Split(String2, " ")) 'Получаем количество слов в строке String2 String2 = " " + String2 + " " If l1 > 0 And l2 > 0 Then 'Должно быть хотя бы по одному слову в каждой строке For n = 0 To l1 'Перебираем все слова в строке String1 If InStr(1, String2, st1(n), vbTextCompare) > 0 Then 'Проверяем их наличие в строке String2 Simil2 = Simil2 + 1 'Считаем количество найденных слов End If Next n Simil2 = Simil2 / (l1 + l2) 'Считаем коэффициент Else Simil2 = 0 End If End If End Function
[/vba] Для лучшей точности определения совпадения строк лучше выполнять вызов дважды, меняя местами операнды: [vba]
Код
d1 = Simil2(Строка1, Строка2) + _ Simil2(Строка2, Строка1) If d1 > 0.45 Then
[/vba] где 0,45 - пороговое значение - подбирается экспериментальноSkif-F