You can use the following code to load a text file like:
Code:
Key1 "Value1"
Key2 "Value2"
Key3
{
Key4 "Value3"
Key5
{
Key6 "Value4"
Key7 "Value5"
}
}
Key8 "Value6"
into a collection like
Code:
c(Key1) = Value1
c(Key2) = Value2
c(Key3)(Key4) = Value3
c(Key3)(Key5)(Key6) = Value4
c(Key3)(Key5)(Key7) = Value5
c(Key8) = Value6
Here is the sub:
VB Code:
Sub LoadConfig(ByVal Config As String, ByRef PassedCollection As Collection)
Dim i As Integer
Dim Binary As String
Dim c() As Collection
Dim BufferingKey() As Boolean
Dim BufferingVal() As Boolean
Dim Key() As String
Dim Val() As String
i = FreeFile
Open Config For Binary As i
Binary = Space(LOF(i))
Get i, , Binary
Close i
Binary = Replace(Binary, vbCrLf, "")
Binary = Replace(Binary, " ", "")
i = 0
ReDim c(i)
ReDim BufferingKey(i)
ReDim BufferingVal(i)
ReDim Key(i)
ReDim Val(i)
Set c(i) = New Collection
BufferingKey(i) = True
Do While Len(Binary) > 0
Select Case Mid(Binary, 1, 1)
Case "{"
i = i + 1
ReDim Preserve c(i)
ReDim Preserve BufferingKey(i)
ReDim Preserve BufferingVal(i)
ReDim Preserve Key(i)
ReDim Preserve Val(i)
Set c(i) = New Collection
BufferingKey(i) = True
Case "}"
i = i - 1
c(i).Add c(i + 1), Key(i)
Key(i) = ""
Val(i) = ""
Case """"
If BufferingVal(i) Then
c(i).Add Val(i), Key(i)
Key(i) = ""
Val(i) = ""
End If
BufferingKey(i) = IIf(BufferingKey(i), False, True)
BufferingVal(i) = IIf(BufferingVal(i), False, True)
Case Else
If BufferingKey(i) Then: Key(i) = Key(i) & Mid(Binary, 1, 1)
If BufferingVal(i) Then: Val(i) = Val(i) & Mid(Binary, 1, 1)
End Select
Binary = Mid(Binary, 2)
Loop
Set PassedCollection = c(0)
End Sub
And here is an example
VB Code:
Private Sub Form_Load()
Dim c As Collection
LoadConfig App.Path & "\test.txt", c
Debug.Print "c(Key1) = " & c("Key1")
Debug.Print "c(Key2) = " & c("Key2")
Debug.Print "c(Key3)(Key4) = " & c("Key3")("Key4")
Debug.Print "c(Key3)(Key5)(Key6) = " & c("Key3")("Key5")("Key6")
Debug.Print "c(Key3)(Key5)(Key7) = " & c("Key3")("Key5")("Key7")
Debug.Print "c(Key8) = " & c("Key8")
End Sub