我相信字典对于这项工作是正确的,但是不确定。应用程序:解析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()。我将使用函数查找某些代码(例如“ F”或“ G”),确保它们不在(注释中),有时提取代码的数值等。
我不知道你需要申报的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
Dictionary的属性来避免所有重复的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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句