vba - 在 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)
我尝试过使用拆分和替换,但由于分隔字段的空格数量不同,它们都不能正常工作。我想知道我唯一的选择是否是逐个字符地读取字符串并以这种方式构建各个字段,但是在我走这条路之前,我是否遗漏了一些明显的东西?我无法控制传入的文件。
解决方案
我倾向于使用 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 是一个包含姓氏、名字和可能的中间名的数组。
推荐阅读
- date - 应用脚本编辑器 - “找不到方法 formatDate(object,string,string)”
- go - 如何解释 os.FileMode 的显示值?
- charts - Google 图表 vAxis 格式未正确显示 %
- data-science-experience - Watson Studio 在 Rstudio 中使用 ibmdbr 连接到 DB2 Z/OS
- typescript - 从 Vue 组件中的 index.html 访问全局窗口变量
- python - 2D滚动窗口分位数的最快方法?
- reactjs - 根据 id 更改 url 并从本地存储中获取值。反应JS
- r - 将 lapply 与多个函数输入一起使用而无需嵌套
- azure - Azure DevOps 中未显示代码覆盖率选项卡
- scala - SparkStreaming/Scala/Twitter java.lang.NoSuchMethodError: twitter4j.TwitterStream.addListener(Ltwitter4j/StreamListener;)V