2014-01-29 20 views
0

給出一個包含有一個字符串:將一組雙引號分隔名稱 - 值對分割成數組的最簡單方法是什麼?

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'的數量是可變的;可能少於或多於三個。編輯2:我已被告知另一個'差異'。 :)原來myprop的值可能不會被雙引號分隔;在這種情況下,它將是一個沒有內部空間的單個字母數字字符串。

+0

字符串的模式是否總是保持不變?如在,它會有'財產'? –

+0

它總是: =「 =「」... – Falconeer

回答

0

這是我想出了。這不是優雅的,但它完成了工作。感謝投入人員,這非常有幫助。

'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) 
0

如果更換(「=「」,‘=’),那麼你可以做一個分裂「」」,這應該給你:

property 
myprop1=test 
myprop2=testing again 
myprop3=another test 

這是假設沒有「引號內(這會使大多數嘗試解析亂七八糟)

然後你可以在'='這個數組中拆分這個數組來得到一個2元素的數組。在拆分()到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 
+0

(放入星號試圖顯示換行符)這給我:****屬性myprop1 = test **** myprop2 =再次測試**** myprop3 =另一個測試myprop4 =另一個測試myprop5 =另一個測試****我沒有注意到可能有三個以上的屬性;我已經更新了這個問題。 – Falconeer

0

試試這個

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 
+0

這個答案也假設了三個屬性;我已經更新了原來的問題。 – Falconeer

+0

@Falconeer - 在我的回答中,您可以擁有任意數量的屬性。第一個詞需要是財產。 –

+0

它將第三個和所有後續NVP放入4元素數組的最後一個元素中。 – Falconeer

相關問題