Наш отдел использует базу данных Microsoft Access для управления примерно 300 000 записями. Интерфейс системы позволяет пользователям добавлять комментарии к записи донора. Как вы могли догадаться, поле комментариев превратилось в дикий запад без каких-либо стандартов ввода комментариев. Что еще хуже, до того, как я начал здесь, в случае, когда у донора уже был комментарий, назначенный его записи, вместо того, чтобы создавать новый комментарий (новую строку в серверной таблице), сотрудники открывали существующий комментарий. комментируйте и добавляйте дополнительные примечания в конце. ТОЛЬКО ОГРАНИЧЕНО ПРОБЕЛОМ!
Одним из случаев добавления комментария является обнаружение повторяющейся записи. Дубликат будет отключен с примечанием, в котором будет указан идентификатор исходной записи для справки.
Пришло время перейти на новую систему, и я хотел бы извлечь эти идентификационные номера из поля комментариев, чтобы их можно было добавить в новую таблицу и использовать для связи исходных и повторяющихся записей, прежде чем мы импортируем ненужные данные. в новую базу данных.
Проблема, с которой я столкнулся: как мне написать запрос для извлечения указанного значения идентификатора из середины поля комментариев, которое является текстовым полем, когда его нет? Все идентификаторы имеют длину 7 цифр. Ниже приведены несколько примеров того, как были введены примерно 4000 экземпляров этих комментариев.
При поиске на форумах мне удалось создать общедоступную функцию, на которую я мог бы ссылаться в запросе, но она извлекает все числовые значения в строке, а не только те, которые находятся в строке из 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
Есть идеи?
Возможно, что-то вроде этого, но 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.
Спасибо вам обоим за то, что направили меня в этом направлении!
Ваш ответ можно улучшить, добавив дополнительную вспомогательную информацию. Пожалуйста, отредактируйте , добавив дополнительную информацию, например цитаты или документацию, чтобы другие могли подтвердить правильность вашего ответа. Более подробную информацию о том, как писать хорошие ответы, вы можете найти в справочном центре.
попробуйте:
\b[0-9]{7}\b
?