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

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

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

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

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

раз Excel, то на вскидку можно через словари чуть ускорить. Забираем диапазоны в массив одним махом, один загоняем в словарь, а циклом по другому уже смотрим в словаре совпадения. Но без файла и примера кода можно только предполагать.
...
Рейтинг: 0 / 0
04.02.2016, 21:07
    #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
05.02.2016, 08:48
    #39163495
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск текста в тексте
попробуйте регулярные выражения
через "или" запишите все варианты слов поиска
...
Рейтинг: 0 / 0
05.02.2016, 10:59
    #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
05.02.2016, 11:24
    #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
05.02.2016, 11:35
    #39163695
kos20
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск текста в тексте
Казанский,

Спасибо огромное, реально быстро работает, раз в 1000х (не шучу)...
С копированием была идея но думал, может есть другие оптимальные решения...
Думаю, что тема закрыта. Спасибо всем.
Пойду создам следующую;)))
...
Рейтинг: 0 / 0
05.02.2016, 14:18
    #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
05.02.2016, 22:52
    #39164572
Казанский
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск текста в тексте
Еще разКазанскийkos20,
если хотите получить оптимальный код, приложите файл килобайт на 100 с частью данных
...
Рейтинг: 0 / 0
08.02.2016, 09:50
    #39165267
kos20
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск текста в тексте
КазанскийЕще разКазанскийkos20,
если хотите получить оптимальный код, приложите файл килобайт на 100 с частью данных

Вот небольшой пример...
...
Рейтинг: 0 / 0
08.02.2016, 23:35
    #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
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Поиск текста в тексте / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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