给定一个包含的字符串:
property myprop1="test" myprop2="testing again" myprop3="another test"
进入字符串数组的最简单方法是什么:
property
myprop1="test"
myprop2="testing again"
myprop3="another test"
分为2维数阵列会更好:
property
myprop1 test
myprop2 testing again
myprop3 another test
我的最初计划是在字符串上使用空格定界符运行拆分功能。如果在名称值对的值部分中没有嵌入的空间,则可以使用,这(当然)确实包含空格。
一些条件:此代码需要在Excel 2010 VBA中执行。我不想添加第三方参考或一堆工具包。我不是在寻找优雅或IEEE示例。我需要可维护和可理解的生产代码。
事先感谢您的所有帮助!
编辑:" mypropx"的数量是可变的;可能有较少或超过三个。EDIT2:我被告知另一个"差异"。:)事实证明,MyProp的价值可能不会被双引号界定;在这种情况下,它将是一个没有内部空间的单个字母字符串。
尝试此
Sub Test()
Dim strVar, Arr1, Arr2()
strVar = "property myprop1=""test"" myprop2=""testing again"" myprop3=""another test"""
Arr1 = Split(Mid(strVar, InStr(1, strVar, " ") + 1), """ ")
ReDim Arr2(UBound(Arr1) + 1)
Arr2(0) = Mid(strVar, 1, InStr(1, strVar, " ")) 'store the first string, i.e. property
'store the data with double quotes
For i = 0 To UBound(Arr1) - 1
Arr2(i + 1) = Arr1(i) & """"
Next
'store the last string
Arr2(i + 1) = Arr1(i)
For i = 0 To UBound(Arr2)
MsgBox Arr2(i)
Next
End Sub
如果您替换('="','='),则可以在''''''上进行拆分,这应该给您:
property
myprop1=test
myprop2=testing again
myprop3=another test
这假定没有"引号"(无论如何都会使大多数试图解析)。
然后,您可以在'='上将项目分开,以进入2个元素数组。要考虑可能=在值之内设置split()上的限制参数为2。
编辑:我感到很慷慨 - 这里有一些代码 - 添加您自己的错误处理!
Public Sub ParseNVPs(ByVal str As String, ByRef ReturnArray() as String)
Dim SplitArray() As String
Dim LineArray() As String
Dim i As Integer
str = Replace(str, "=""", "=")
SplitArray = Split(str, """ ")
ReDim ReturnArray(UBound(SplitArray), 1)
For i = 0 To UBound(SplitArray)
LineArray = Split(SplitArray(i), "=", 2)
ReturnArray(i, 0) = LineArray(0)
ReturnArray(i, 1) = LineArray(1)
Next i
End Sub
这是我想到的。它不是优雅的,但可以完成工作。感谢您的输入人,这非常有帮助。
'split name value pairs into array
strWorkString = schematicLines(lngValuePosition)
lngStartPosition = 1
lngEndPosition = 1
fStartQuote = False
f1stWordDone = False
ReDim strWorkArray(0) As String
For lngLoopCounter = 1 To Len(strWorkString) - 1
strCurrentCharacter = Mid(strWorkString, lngLoopCounter, 1)
Select Case True
Case (strCurrentCharacter = " " And Not fStartQuote) 'space and we aren't in a value
If (f1stWordDone) Then
ReDim Preserve strWorkArray(UBound(strWorkArray) + 1) As String
End If
lngEndPosition = lngLoopCounter
strWorkArray(UBound(strWorkArray)) = Trim(Mid(strWorkString, lngStartPosition, lngEndPosition - lngStartPosition))
lngStartPosition = lngEndPosition + 1
lngEndPosition = lngStartPosition
f1stWordDone = True
Case strCurrentCharacter = Chr$(34) 'double quote
If fStartQuote Then 'in a value
'store the nvp
lngEndPosition = lngLoopCounter
ReDim Preserve strWorkArray(UBound(strWorkArray) + 1) As String
strWorkArray(UBound(strWorkArray)) = Trim(Mid(strWorkString, lngStartPosition, lngEndPosition - lngStartPosition + 1))
lngLoopCounter = lngLoopCounter + 1 'skip the space
lngStartPosition = lngLoopCounter
lngEndPosition = lngStartPosition
fStartQuote = False
Else
fStartQuote = True
End If
End Select
Next lngLoopCounter
' get the last nvp
ReDim Preserve strWorkArray(UBound(strWorkArray) + 1) As String
strWorkArray(UBound(strWorkArray)) = Mid(strWorkString, lngStartPosition, lngLoopCounter - lngStartPosition + 1)