Страницы: 1
RSS
Вызов массива регулярных выражений в VBA из БД Postgres, VBA + SQL
 
Добрый день!

У меня есть скрипт для анализа текстовых массивов, работающий на регулярных выражениях. Разные части определенного текста последовательно проверяются на совпадения с разными типами массивов регулярных выражений.
Массивов регулярных выражений несколько, они разделены по типам, в каждом массиве может находится до 1500 регулярных выражений.

Вызываются они в скрипте следующим образом:
Код
Private Function good_bye(ByVal call_transcript As String) As String

    Static RE As Object, GoodByeArray
    Dim i As Byte

    If IsArray(GoodByeArray) Then GoTo work

        Set RE = CreateObject("VBScript.RegExp")
        RE.Global = True
        ReDim GoodByeArray(1 To 11)

        GoodByeArray(1) = "(^|\s)(чего|всего)(\s|)(доброго|хорошего)"
        GoodByeArray(2) = "(^|\s)до(\s|)свидан"
        GoodByeArray(3) = "^(до(|\s)сида)$"
        GoodByeArray(4) = "все(\s)добро($)"
        GoodByeArray(5) = "до(|\s)свида"
        GoodByeArray(6) = "(^|\s)свидани[яе]($|\s)"
        GoodByeArray(7) = "всего(\s)(добр|хорош)"
        GoodByeArray(8) = "зачес(\s)ивана"
        GoodByeArray(9) = "всех(\s)благ"
        GoodByeArray(10) = "хорошего.{0,6}(\s)(дня|вечер)"
        GoodByeArray(11) = "доброй.{0,6}(\s)ночи"


work:
       For i = 1 To 11
          RE.Pattern = GoodByeArray(i)
          If RE.test(call_transcript) Then good_bye = RE.Execute(call_transcript)(0): Exit For
       Next i

End Function
Текущая схема довольно топорная, так как при необходимости добавления новых регулярных выражений/удаления старых/редактирования - необходимо лезть в код и редактировать это там. Так как скрипт используется несколькими людьми, при любых изменениях у одного человека, ему необходимо оповестить об этом другого, что вызывает очень большой дискомфорт, так как изменений в коде может быть довольно много за короткий промежуток времени.

Очень хочется замкнуть этот процесс, например, на какой-нибудь табличке в БД.
Кто-то может помочь разобраться с тем, как в кусок кода сверху вставить селект из определенной таблицы БД, чтобы происходило ровно тоже самое, как с регулярными выражениями изнутри кода? Чтобы скрипт последовательно вызывал по одному регулярному выражению, и если не находил совпадения, переходил к следующей строчке в таблице БД, пока не переберет их всех?

Я отдаленно понимаю, как мне бросить заброс в бд и даже понимаю как мне его потом выгрузить на лист чем-то вроде следующего кода:

Код
    query_v2 = "запрос"

    Set conn = CreateObject("ADODB.Connection")
    
        strCnx = "Driver={PostgreSQL UNICODE(x64)};Server=адрес;Port=порт;Database=бдl;Uid=логин;Pwd=пароль"
        conn.Open strCnx

    'Бросаем запрос в базу
    Set rs = CreateObject("ADODB.recordset")
        rs.Open query_v2, conn
        'Получаем список записей из бд
        record = rs.GetRows()
        'Обрываем подключение
        rs.Close
        conn.Close
    
    For Each item In record
      Range("A" & count) = item
      count = count + 1
    Next
Но как мне перебирать регулярные выражения, которые находятся в таблице БД, нет идей совсем.
Заранее спасибо  8-0  
 
Цитата
Алексей Краснов написал:
Но как мне перебирать регулярные выражения
переберите циклом
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Алексей Краснов написал:
и даже понимаю как мне его потом выгрузить на лист
в зависимости от того как часто дергается скрипт и как часто меняются данные запрос можно делать каждый раз или при первом использовании скрипта в текущем окружении
фактически

Код
Private Function good_bye(ByVal call_transcript As String) As String
     Static RE As Object
work:
 query_v2 = "запрос"
     Set conn = CreateObject("ADODB.Connection")
     
        strCnx = "Driver={PostgreSQL UNICODE(x64)};Server=адрес;Port=порт;Database=бдl;Uid=логин;Pwd=пароль"
        conn.Open strCnx
 
    'Бросаем запрос в базу
    Set rs = CreateObject("ADODB.recordset")
        rs.Open query_v2, conn
        'Получаем список записей из бд
        record = rs.GetRows()
        'Обрываем подключение
        rs.Close
        conn.Close

    For Each item In record
          RE.Pattern = item
          If RE.test(call_transcript) Then good_bye = RE.Execute(call_transcript)(0): Exit For
    Next
End Function
По вопросам из тем форума, личку не читаю.
Страницы: 1
Наверх