从 MS Access 2016 中的字符串字段中间提取数值

问题描述 投票:0回答:1

我们部门使用 Microsoft Access 数据库来管理大约 300,000 条记录。系统的前端允许用户向捐赠者的记录添加评论。正如您可能猜到的那样,评论字段变成了狂野的西部,没有关于如何输入评论的标准。更糟糕的是,在我开始之前,在捐赠者已经为其记录分配了评论的情况下,工作人员将打开现有的评论,而不是创建新评论(后端表中的新行)评论并在末尾添加附加注释。仅由空格分隔!

添加注释的情况之一是发现重复记录。重复项将被禁用,并附有列出原始记录 ID 以供参考的注释。

我们迁移到新系统的时间已经到了,我很想将这些 ID 号从注释字段中取出,以便可以将它们添加到新表中,并在我们导入不必要的数据之前将原始记录和重复记录链接在一起。数据存入新数据库。

我遇到的问题是;如果没有,如何编写查询以从作为文本字段的注释字段中间提取引用的 ID 值?所有 ID 的长度都是 7 位数字。以下是如何输入这些评论的大约 4,000 个实例的几个示例。

  • dup参见1189827,丽塔是怀特夫人
  • 4-16-18 d DUPE - 1344126
  • d DUPE 2021108.AB.
  • 重复 1717677 Missie 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

有什么想法吗?

regex vba ms-access
1个回答
0
投票

也许是这样的,但正则表达式可能更好:

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
© www.soinside.com 2019 - 2024. All rights reserved.