Also, ein paar Tipps wie ich das vielleicht machen würde. Erstens zwei Klassen
Public Class UnterBlock
Public Typ As String
Public Name As String
Public Modell As String
End Class
Public Class BlockName
Public Name As String
Public Nummer As Integer
Public Position As Integer
Public [Option] As Integer
Public Unterblocks As New List(Of UnterBlock)
Public BlockNames As New List(Of BlockName)
End Class Dann merken wir, dass alles in der Form keyword = wert vorliegt (wo wert auch eine ganze Gruppe mit Untergruppen zwischen "{" und "}" sein kann). Daher eine Klasse um solche Werte auszulesen
Public Class KeyGroupReader
Private npos As Integer
Private data As String
Public Sub New(ByVal data As String)
Me.data = data
End Sub
Public Function GetKeywordParameter(ByVal name As String, ByVal t As Type) _
As String
Dim pn As String = getToken()
Dim sep As String = getToken()
Dim val As String = getToken()
Dim b1 As Boolean = (name <> "?" AndAlso name <> pn)
If (name <> "?" AndAlso name <> pn) OrElse sep <> "=" OrElse val = _
String.Empty Then
MsgBox("Wrong!")
Return String.Empty
End If
Return val
End Function
Dim seps As Char() = {vbCr, vbLf, "=", "{", "}", " "}
Private Function getToken() As String
skipWhiteSpace()
Dim spos As Integer = npos
Select Case data(npos)
Case """"
Return getQuotedStringToken()
Case "{"
Return getBlockDataToken()
Case "="
npos += 1
Return data(npos - 1)
Case Else
End Select
Do While npos < data.Length AndAlso Not seps.Contains(data(npos))
npos += 1
Loop
Return data.Substring(spos, npos - spos)
End Function
Private Function getQuotedStringToken() As String
Dim spos = npos
npos += 1
Dim res As String = String.Empty
While npos < data.Length
If npos = data.Length OrElse data(npos) = """" Then
npos += 1
If npos < data.Length AndAlso data(npos) = """" Then
npos += 1
Continue While
End If
res = data.Substring(spos, npos - spos)
Exit While
End If
npos += 1
End While
Return res
End Function
Private Function getBlockDataToken() As String
Dim spos As Integer = npos
Dim level As Integer
If data(npos) = "{" Then
npos += 1
level += 1
While npos < data.Length
Select Case data(npos)
Case """"
getQuotedStringToken()
Case "{"
level += 1
Case "}"
level -= 1
If level = 0 Then Exit While
End Select
npos += 1
End While
npos += 1
Return data.Substring(spos, npos - spos)
Else
If npos <> data.Length Then
MsgBox("Invalid!!!")
End If
End If
Return String.Empty
End Function
Private Sub skipWhiteSpace()
While npos < data.Length AndAlso Char.IsWhiteSpace(data(npos))
npos += 1
End While
End Sub
End Class Dann die Hauptroutine
Private BlockNames As New List(Of BlockName)
Private Sub ReadBlockNames(pfad As String)
Dim sr As New IO.StreamReader(pfad)
Dim data As String = sr.ReadToEnd()
sr.Close()
Dim kgr As New KeyGroupReader(data)
Dim blockNameData As String
' Process main blocks
Do
blockNameData = kgr.GetKeywordParameter("Blockname", Nothing)
If blockNameData <> String.Empty Then
Dim bn As New BlockName
Debug.WriteLine(blockNameData)
Dim kgrbn As New KeyGroupReader(blockNameData.Substring(1, _
blockNameData.Length - 2))
Dim val = kgrbn.GetKeywordParameter("Name", Nothing)
bn.Name = val
val = kgrbn.GetKeywordParameter("Nummer", Nothing)
bn.Nummer = val
val = kgrbn.GetKeywordParameter("Position", Nothing)
bn.Position = val
val = kgrbn.GetKeywordParameter("Option", Nothing)
bn.Option = val
' Unterblöcke behandeln
' Sub-Blocknamen behandeln
BlockNames.Add(bn)
End If
Loop While blockNameData <> String.Empty
End Sub Also, das ist alles sehr schnell geschrieben und kaum ausführlich getestet. Es gibt kaum Fehlerbehandlung, und man sollte besser Klassen für die Analyse von Blocknamen, Unterblocks usw. haben. Aber vielleicht hilft das ein wenig. Und ich habe nur Blockname und die ersten vier Werte programmiert. Unterblöcke und Sub-Blocknamen kann man ganz ähnlich programmieren.
________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist |