首页 > 解决方案 > 在 MSAccess VBA 中使用不同数量的分隔符解析字符串

问题描述

在 MSAccess VBA 中,我试图将名称字段解析为最后、第一、中间。问题是传入的格式不一致:

Jones         John  Q
Doe   Jane
Smith Robert     X

这就是我正在做的

Dim rsNames As DAO.Recordset
Set rsNames = CurrentDb.OpenRecordset("SELECT * FROM tblInput")
If Not (rsNames.EOF And rsNames.BOF) Then
    rsNames.MoveFirst 
    Do Until rsNames.EOF = True
        strFullName = rsNames!Name
        intLength = Len(strFullName)
        intSpacePos = InStr(strFullName, " ")
        strLname = Left(strFullName, intSpacePos - 1)
        strFname = Mid(strFullName, intSpacePos, intLength - (intSpacePos - 1))
        strFname = Trim(strFname)
        If Len(strFname) + Len(strLname) + (intSpacePos - 1) < intLength Then
                  strMI = Right(strFullName, 1)
        End If
        rsNames.Edit
        rsNames!LastName = strLname
        rsNames!FirstName = strFname
        rsNames!MiddleInitial = strMI
        rsNames.Update
        rsNames.MoveNext
    Loop

结果

LastName: Jones
FirstName: John     Q
Middle Initial: Q

LastName: Doe
FirstName: Jane
Middle Initial: E

如果我将此行更改 strFname = Mid(strFullName, intSpacePos, intLength - (intSpacePos - 1))strFname = Mid(strFullName, intSpacePos, intLength - (intSpacePos),则带有中间首字母的行会正确解析,但没有中间首字母的行会截断名字的最后一个字符并将其移动到中间首字母字段(Doe Jan E)

我尝试过使用拆分和替换,但由于分隔字段的空格数量不同,它们都不能正常工作。我想知道我唯一的选择是否是逐个字符地读取字符串并以这种方式构建各个字段,但是在我走这条路之前,我是否遗漏了一些明显的东西?我无法控制传入的文件。

标签: vbastringms-accessparsingdelimiter

解决方案


我倾向于使用 RegEx 和 Split:

Private Sub Test()
   Dim strFullName As String
   Dim NameParts As Variant
   
   strFullName = "Jones         John  Q"

   With CreateObject("vbscript.regexp")
      .Pattern = "\s+"
      .Global = True
      strFullName = .Replace(strFullName, " ")
   End With
   
   NameParts = Split(strFullName, " ")
End Sub

NameParts 是一个包含姓氏、名字和可能的中间名的数组。


推荐阅读