我相信字典对于这项工作是正确的,但我不确定。应用程序:解析CNC机器代码(文本),识别代码中的序列并存储特定于每个序列的字典。序列数有所不同。找到重要代码后,将存储行号。完成后,文本可以再次迭代,使用存储的行号作为标志,根据需要进行更改。
我过去已经解决了这个问题,但解决方案涉及像疯了一样循环并重复读取相同的数据。它应该更清洁。
这是我对这次新尝试的逻辑所在。我想动态声明字典,但不知道是否可能。
Dim in_list As New List(Of String)
Dim sequences As New Dictionary(Of Integer, Dictionary(Of String, Decimal))
Try
Dim S100 As New Dictionary(Of String, Decimal)
Dim S200 As New Dictionary(Of String, Decimal)
'
'Dim S5000 as New Dict... come on, now.
'
Dim reader As New StreamReader(filename)
Dim sequence_number As Integer = 0
Dim line_number As Integer = -1
Do While reader.Peek <> -1
Dim L As String = reader.ReadLine
line_number += 1
in_list.Add(L)
'Will be parsing differently, but string.indexof() for example:
If L.IndexOf("M6") > -1 Then 'M6 marks the beginning of a sequence.
sequence_number += 100
If sequence_number = 100 Then
sequences.Add(sequence_number, S100)
sequences(sequence_number).Add("M6", line_number)
End If
If sequence_number = 200 Then
sequences.Add(sequence_number, S200)
sequences(sequence_number).Add("M6", line_number)
End If
'
' If sequence_number = 5000...
' really dude?
'
End If
'Below is not the problem, but may help for suggestions in case
' a dictionary should not be used, or any suggestion.
If sequence_number > 0 And sequences.ContainsKey(sequence_number) Then
If L.IndexOf("F") > -1 Then
If Not sequences(sequence_number).ContainsKey("first_F") Then
sequences(sequence_number).Add("first_F", line_number)
End If
If Not sequences(sequence_number).ContainsKey("last_F") Then
sequences(sequence_number).Add("last_F", line_number)
Else
sequences(sequence_number).Item("last_F") = line_number
End If
End If
End If
Loop
reader.Close()
Catch ex As Exception
End Try
我正在解析的一些代码是:
N100(5/16" CENTER CUTTING MILL)
M6T4
G0G80G90G54X.44Y0.S1550M3
G43H4Z1./M8
G98G81Z-.005R.4F3.
X.37Y0.
X.3Y0.
G80M9
G91G28Z0.M19
G90
M01
我实际上并没有使用一个简单的string.IndexOf(),如此代码所示。我将使用函数来查找某些代码(例如&#34; F&#34;或&#34; G&#34;),确保它们不在(注释)中,有时提取代码的数值等
答案 0 :(得分:1)
我不知道您需要提前宣布 Dictionary
,是吗?
在本节中:
sequence_number += 100
If sequence_number = 100 Then
sequences.Add(sequence_number, S100)
sequences(sequence_number).Add("M6", line_number)
End If
'
' If sequence_number = 5000...
' really dude?
'
您可以使用sequences
字典的属性来避免所有重复的If
语句,例如:
sequence_number += 100
If Not sequences.ContainsKey(sequence_number) Then
'you have not defined the dictionary for this sequence
'first do that
sequences.Add(sequence_number, new Dictionary(Of String, Decimal))
End If
'at this point you have a Dictionary for this sequence_number, so use it
sequences(sequence_number).Add("M6", line_number)