powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Поиск текста в тексте
18 сообщений из 18, страница 1 из 1
Поиск текста в тексте
    #39162919
kos20
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!
Столкнулся с тем, что мой код поиска массива в массиве медленно работает, может кто уже делал такое и сможет мне помочь.
Суть такова, есть массив текста из которого нужно выцепить текст (текст в виде массива).
Пример
Тест :
***** ИСКОМОЕ СЛОВО1 ***** ***** **** ******** ****
***** ИСКОМОЕ СЛОВО2 ***** ***** **** ******** ****
***** ИСКОМОЕ СЛОВО3 ***** ***** **** ******** ****

Массив слов:
ИСКОМОЕ СЛОВО1
ИСКОМОЕ СЛОВО2
ИСКОМОЕ СЛОВО3

результат работы поиска: ***** ИСКОМОЕ СЛОВО1 ***** ***** **** ******** **** => ИСКОМОЕ СЛОВО1
... думаю понятно.

Задачу решил просты перебором, все бы ничего, но как только кол-во строк переваливает за 10 000 и кол-во искомых слов за 1000, то ждать приходится достаточно долго.
Может у кого есть более быстрый алгоритм?
...
Рейтинг: 0 / 0
Поиск текста в тексте
    #39162924
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
код в студию
...
Рейтинг: 0 / 0
Поиск текста в тексте
    #39162955
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А какой тут в пень алгоритм, если всё равно надо сравнить каждый элемент первого массива с каждым элементом второго? разве что искать быстрый алгоритм поиска подстроки в строке - но это без внешней библиотеки с такой функцией мне представляется сомнительным.
...
Рейтинг: 0 / 0
Поиск текста в тексте
    #39162961
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вангую,
там у ТС с конкатенацией строк тормоза скорее всего
...
Рейтинг: 0 / 0
Поиск текста в тексте
    #39162975
kos20
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто может можно как-то через ВПР искать, думается, что должен быстрее работать.
...
Рейтинг: 0 / 0
Поиск текста в тексте
    #39162995
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у вас Excel что ли?
...
Рейтинг: 0 / 0
Поиск текста в тексте
    #39163039
kos20
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,

ДА, специфика деятельности..
...
Рейтинг: 0 / 0
Поиск текста в тексте
    #39163053
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
выкладывайте код, тут кто-нибудь и по Excel подскажет
...
Рейтинг: 0 / 0
Поиск текста в тексте
    #39163165
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kos20,

раз Excel, то на вскидку можно через словари чуть ускорить. Забираем диапазоны в массив одним махом, один загоняем в словарь, а циклом по другому уже смотрим в словаре совпадения. Но без файла и примера кода можно только предполагать.
...
Рейтинг: 0 / 0
Поиск текста в тексте
    #39163370
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kos20,
может так, с одним явным циклом
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Sub kos20()
Dim x
  For Each x In Range("H1:H3").Value 'массив искомых слов в H1:H3
                                     'массив текста в 1 столбце
    Columns(1).Replace What:="*" & x & "*", Replacement:=x, _
        LookAt:=xlWhole, MatchCase:=False, SearchFormat:= _
        False, ReplaceFormat:=False
  Next
End Sub
...
Рейтинг: 0 / 0
Поиск текста в тексте
    #39163495
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуйте регулярные выражения
через "или" запишите все варианты слов поиска
...
Рейтинг: 0 / 0
Поиск текста в тексте
    #39163644
kos20
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Казанскийkos20,
может так, с одним явным циклом
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Sub kos20()
Dim x
  For Each x In Range("H1:H3").Value 'массив искомых слов в H1:H3
                                     'массив текста в 1 столбце
    Columns(1).Replace What:="*" & x & "*", Replacement:=x, _
        LookAt:=xlWhole, MatchCase:=False, SearchFormat:= _
        False, ReplaceFormat:=False
  Next
End Sub



Спасибо, работает в разы быстрее!!! А можно ли переписать код чтобы не Replace а как-то искал в Columns(1), а результат выдавал в Columns(2)? ))
...
Рейтинг: 0 / 0
Поиск текста в тексте
    #39163683
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kos20,
если хотите получить оптимальный код, приложите файл килобайт на 100 с частью данных.
Если использовать Replace, надо скопировать столбец текста в столбец результата и обрабатывать его:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Sub kos20()
Dim x
  columns(1).copy columns(2)
  For Each x In Range("H1:H3").Value 'массив искомых слов в H1:H3
                                     'массив текста в 1 столбце, массив результатов во 2 столбце
    Columns(2).Replace What:="*" & x & "*", Replacement:=x, _
        LookAt:=xlWhole, MatchCase:=False, SearchFormat:= _
        False, ReplaceFormat:=False
  Next
End Sub

Что должно быть в столбце результата, если в тексте нет ни одного искомого слова? Replace ессно оставит исходный текст.
...
Рейтинг: 0 / 0
Поиск текста в тексте
    #39163695
kos20
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Казанский,

Спасибо огромное, реально быстро работает, раз в 1000х (не шучу)...
С копированием была идея но думал, может есть другие оптимальные решения...
Думаю, что тема закрыта. Спасибо всем.
Пойду создам следующую;)))
...
Рейтинг: 0 / 0
Поиск текста в тексте
    #39163966
kos20
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Казанскийkos20,
если хотите получить оптимальный код, приложите файл килобайт на 100 с частью данных.
Если использовать Replace, надо скопировать столбец текста в столбец результата и обрабатывать его:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Sub kos20()
Dim x
  columns(1).copy columns(2)
  For Each x In Range("H1:H3").Value 'массив искомых слов в H1:H3
                                     'массив текста в 1 столбце, массив результатов во 2 столбце
    Columns(2).Replace What:="*" & x & "*", Replacement:=x, _
        LookAt:=xlWhole, MatchCase:=False, SearchFormat:= _
        False, ReplaceFormat:=False
  Next
End Sub

Что должно быть в столбце результата, если в тексте нет ни одного искомого слова? Replace ессно оставит исходный текст.

А как удалить те, которые не менялись?
...
Рейтинг: 0 / 0
Поиск текста в тексте
    #39164572
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще разКазанскийkos20,
если хотите получить оптимальный код, приложите файл килобайт на 100 с частью данных
...
Рейтинг: 0 / 0
Поиск текста в тексте
    #39165267
kos20
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КазанскийЕще разКазанскийkos20,
если хотите получить оптимальный код, приложите файл килобайт на 100 с частью данных

Вот небольшой пример...
...
Рейтинг: 0 / 0
Поиск текста в тексте
    #39166099
kos20
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Казанский, ну вот как-то так наверно. Если есть замечания, велкам...
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Sub dddd()

For Each r In Range("h3:h4")


With Range("D1:D100")
    Set c = .Find("*" & r.Value & "*", LookIn:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Range("F" & c.Row) = r.Value
        Do
'            c.Value = 5
            Set c = .FindNext(c)
            Debug.Print c.Address
            Range("F" & c.Row) = r.Value
        Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
End With


Next r
End Sub
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Поиск текста в тексте
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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