Извлечение числового значения из середины строкового поля в MS Access 2016

Наш отдел использует базу данных Microsoft Access для управления примерно 300 000 записями. Интерфейс системы позволяет пользователям добавлять комментарии к записи донора. Как вы могли догадаться, поле комментариев превратилось в дикий запад без каких-либо стандартов ввода комментариев. Что еще хуже, до того, как я начал здесь, в случае, когда у донора уже был комментарий, назначенный его записи, вместо того, чтобы создавать новый комментарий (новую строку в серверной таблице), сотрудники открывали существующий комментарий. комментируйте и добавляйте дополнительные примечания в конце. ТОЛЬКО ОГРАНИЧЕНО ПРОБЕЛОМ!

Одним из случаев добавления комментария является обнаружение повторяющейся записи. Дубликат будет отключен с примечанием, в котором будет указан идентификатор исходной записи для справки.

Пришло время перейти на новую систему, и я хотел бы извлечь эти идентификационные номера из поля комментариев, чтобы их можно было добавить в новую таблицу и использовать для связи исходных и повторяющихся записей, прежде чем мы импортируем ненужные данные. в новую базу данных.

Проблема, с которой я столкнулся: как мне написать запрос для извлечения указанного значения идентификатора из середины поля комментариев, которое является текстовым полем, когда его нет? Все идентификаторы имеют длину 7 цифр. Ниже приведены несколько примеров того, как были введены примерно 4000 экземпляров этих комментариев.

  • дубликат см. 1189827, Рита - миссис Уайт.
  • 4-16-18 д ДУПЕ - 1344126
  • d DUPE 2021108. AB.
  • Дубликат 1717677 Мисси RIP
  • 4-10-14 используйте DUP #1323678, так как именно там находится история.

При поиске на форумах мне удалось создать общедоступную функцию, на которую я мог бы ссылаться в запросе, но она извлекает все числовые значения в строке, а не только те, которые находятся в строке из 7 последовательных цифр?

Public Function ExtractDonorID(strInput) As String
    Dim strResult As String, strCh As String
    Dim z As Integer
    If Not IsNull(strInput) Then
        For z = 1 To Len(strInput)
            strCh = Mid(strInput, z, 1)
            Select Case strCh
                Case "0" To "9"
                    strResult = strResult & strCh
                Case Else
            End Select
        Next z
    End If
    ExtractDonorID= strResult
End Function

Есть идеи?

попробуйте: \b[0-9]{7}\b?

user24714692 10.07.2024 20:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Возможно, что-то вроде этого, но Regexp может быть лучше:

Sub Tester()
    Dim v
    For Each v In Array("dup see 1189827, Rita is Mrs. White", _
                        "dup see 11898278, Rita is Mrs. White", _
                        "4-16-18 d DUPE - 1344126", _
                        "4-16-18 d DUPE - 134412")
        Debug.Print v, vbLf, "Found: " & ExtractNumericId(v)
    Next v
End Sub


Public Function ExtractNumericId(ByVal strInput) As String
    Const NUM_DIGITS As Long = 7 'this many and no more....
    Dim txt As String, patt As String
    Dim z As Long, l As Long
    
    If Not IsNull(strInput) Then
        l = Len(strInput)
        patt = String(NUM_DIGITS, "#") 'checking for x digits...
        strInput = strInput & " "      'kludge in case digits are at the end of the input
        z = 1
        Do While z <= l - (NUM_DIGITS - 1)
            txt = Mid(strInput, z, NUM_DIGITS)
            If txt Like patt Then
                'check next character is not also a digit...
                If Not Mid(strInput, z + NUM_DIGITS, 1) Like "#" Then
                    ExtractNumericId = txt
                    Exit Function
                Else
                    z = z + NUM_DIGITS 'skip this section...
                End If
            End If
            z = z + 1
        Loop
    End If
End Function

В исходном принятом коде была ошибка — это более надежно:

Public Function ExtractNumericId2(ByVal strInput) As String
    Const NUM_DIGITS As Long = 7 'this many and no more....
    Dim txt As String
    Dim z As Long, l As Long, ch As String
    
    strInput = strInput & " " 'kludge in case id is at the end of the input
    For z = 1 To Len(strInput)
        ch = Mid(strInput, z, 1)
        If ch Like "#" Then 'is a digit?
            txt = txt & ch  'append to potential id
        Else
            If Len(txt) = NUM_DIGITS Then 'just ended a NUM_DIGITS run?
                ExtractNumericId2 = txt    'return the id
                Exit Function
            Else
                txt = ""   'reset potential id
            End If
        End If
    Next z
End Function

Вместо этого я использовал Regex или цикл VBA. Мне было трудно понять, как создать функцию RegExp для последующего использования в моем запросе, но я нашел эту страницу https://www.ablebits.com/office-addins-blog/regex-extract-strings-excel/ . Эта функция предназначалась для Excel, но она отлично работала и в Access. Создав функцию, я смог вызвать ее в запросе и использовать «\b[0-9]{7}\b» в качестве шаблона, предложенного пользователем24714692.

Спасибо вам обоим за то, что направили меня в этом направлении!

Другие вопросы по теме