我想将一个关于PCB组件的文本文件解析成一个数组。文本的一部分是这样的:
COMP C1 MC-0000-0427 CAPACITOR 0402 0,565 5,395 2 90
C_PROP (MFG,"VISHAX") (VALUE,"10n") (TOLER,"10%") (COMPONENT_TYPE,"CAPACITOR") (REFLOC,"IN,0.02,0.0,0,CC,0.015,0.009,0.006,STD,1,YERLESIM")
C_PROP (MGC_CAT,"capacitor") (MGC_LIB,"MST Develepment Library") (MGC_INDEX,"MC-0000-0427")
C_PIN C1-1 0,565 5,395 32 2 90 PAD20X25 VA_3V3_ADC1
C_PIN C1-2 0,565 5,435 32 2 90 PAD20X25 GROUND
COMP C10 MC-0000-0427 CAPACITOR 0402 2,55 5,275 2 90
C_PROP (MFG,"VISHAX") (VALUE,"10n") (TOLER,"10%") (COMPONENT_TYPE,"CAPACITOR") (REFLOC,"IN,0.02,0.0,0,CC,0.015,0.009,0.006,STD,1,YERLESIM")
C_PROP (MGC_CAT,"capacitor") (MGC_LIB,"MST Development Library") (MGC_INDEX,"MC-0000-0427")
C_PIN C10-1 2,55 5,275 32 2 90 PAD20X25 VA_3V3_ADC4
C_PIN C10-2 2,55 5,315 32 2 90 PAD20X25 GROUND
COMP C100 MC-0000-0393 CAPACITOR 0402 3,29 4,105 2 0
C_PROP (MFG,"['MURATA','NIL',CAL CHIP']") (VALUE,"100n") (TOLER,"10%") (COMPONENT_TYPE,"CAPACITOR") (REFLOC,"IN,0.02,0.0,0,CC,0.105,0.009,0.006,std,1,YERLESIM")
C_PROP (MGC_CAT,"capacitor") (MGC_LIB,"MST Develeopment Library") (MGC_INDEX,"MC-0000-0363")
C_PIN C100-1 3,29 4,105 32 2 0 PAD20X25 GROUND
C_PIN C100-2 3,29 4,105 32 2 0 PAD20X25 VCC_2V5
这些只是文本的三个组成部分。 C1,C10和C100电容器。首先,我不需要所有这些信息。我需要的是“组件名称”(exp:C1),“组件的坐标”(exp:C1的坐标是x = 0,565和y = 5,395),“放置组件的哪个面”(exp:C1放在第二个面上)董事会。),“组件的Allignment”(exp:C1的allignment是90度。)和关于组件所有每个引脚的相同信息。如您所见,此信息存在于文本中。
数组将是这样的:
Column0 Column1 Column2 Column3 Column4 Column5
Row0 "C1" 0 0,565 5,395 2 90
Row1 "C1" 1 0,565 5,395 2 90
Row2 "C1" 2 0,565 5,435 2 90
Row3 "C10" 0 2,55 5,275 2 90
Row4 "C10" 1 2,55 5,275 2 90
Row5 "C10" 2 2,55 5,315 2 90
Row6 "C100" 0 3,29 4,105 2 0
Row7 "C100" 1 3,29 4,105 2 0
Row8 "C100" 2 3,25 4,105 2 0
.....
..... //and goes on..
第0列:组件的名称。
第1列:组件的引脚。我将使程序写为“0”以定义组件本身而不是其引脚。然后它将写入“1”和“2”,表示组件的第1和第2引脚。
第2列:x坐标线。
第3列:y坐标线。
第4栏:董事会的面孔。这个板子有两个面孔。有些组件在1号,有些组件在第2张脸上。
第5列:组件的分配。
这个主板上有超过750个组件,所以这些只是冰山一角。我的意思是,行号不固定。当程序找到新的组件或引脚时,它会添加一个新行。有些组件有超过100个引脚,引脚名称也在变化。例如:有一个名为“KN3”的组件,它的引脚被命名为“AF-18”(KF3-AF-18:它在文本中像这样写,就像其他人一样。)。所以我不会写“1”或“2”。我会在第1栏写“AF-18”。但是这个信息,我的意思是引脚的名称存在于文件中,就像这些组件的引脚一样。
我在开头给出的文件样本是文本的“组件”部分。还有其他标题和部分,但我不需要它们。我只使用以“COMP”开头的行(单词后面有空格)和“COMP”行下面的引脚部分。所以我不需要以“C_PROP”开头的行。我想将所有信息写入一个数组。
答案 0 :(得分:0)
首先按COMP拆分,抓取每个COMP并按换行将该COMP拆分为行。抓住第一行并添加。
string[] _compSplitted = text.Split(new string[] { "COMP"}, StringSplitOptions.Empty);
答案 1 :(得分:0)
这是一个方向,因为没有人会为你编写代码
http://www.RegexHero.com是测试字符串正则表达式的好地方。
C# Regex Sheet是c#regex的备忘单/指南
Dot Net Perls这是从c#
开始使用正则表达式的好地方答案 2 :(得分:0)
我会把那些代码写给你(我昨天刚刚给我写了这封信) 这是在VB中,并不是完整的,但应该足以开始。
Dim rxsDecimal As String = "([-+]?[0-9]*\.[0-9]+|[-+]?[0-9]+)"
Dim rxsOptionalQuotedStr As String = "("".+""|\S+)"
Dim xCMP As New Regex(String.Format("COMP\s+(\S+)\s+(\S+)\s+{1}\s+(\S+)\s+{0}\s+{0}\s+{0}\s+{0}", rxsDecimal, rxsOptionalQuotedStr))
Dim m As Match = xCMP.Match(currentLine)
Dim ComponentRef As String = m.Groups(1).Value
Dim ComponentPartNo As String = m.Groups(2).Value
Dim ComponentDesc As String = m.Groups(3).Value
Dim ComponentGeom As String = m.Groups(4).Value
Dim ComponentX As String = m.Groups(5).Value
Dim ComponentY As String = m.Groups(6).Value
Dim Side As String = m.Groups(7).Value
Dim ComponentRotation As String = m.Groups(8).Value
我发现设计和测试正则表达式的最佳工具是Expresso。它是免费的,但你必须在一段时间后注册。 http://www.ultrapico.com/Expresso.htm