2013-06-24 55 views
-5

我想将有关PCB组件的文本文件解析为数组。部分文字如下:将文本文件解析为C#中的数组

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的排列是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栏:面板。这个委员会有两个面孔。一些组件在一号,一些在二号脸上。

第5列:组件的分配。

该板上有750多个组件,所以这些只是冰山的顶部。我的意思是,行号不固定。当程序找到新的组件或引脚时,它会添加一个新行。一些组件有超过100个引脚,引脚名称正在改变。例如:有一个名为“KN3”的组件,其引脚被命名为“AF-18”(KF3-AF-18:与其他文件一样,它在文本中是这样写的)。所以我不会写“1”或“2”。我将在第一栏写上“AF-18”。但是这个信息,我的意思是引脚的名字存在于文件中,就像这些组件的引脚一样。

我在开始时给出的文件样本是文本的“组件”部分。还有其他的标题和部分,但我不需要它们。我只能使用以“COMP”开头的行(字之后有空格)和“COMP”行下面的引脚部分。所以我不需要以“C_PROP”开头的行。我想把所有的信息写入一个数组中。

+1

将其拆分为每个COMP,然后针对每个COMP运行正则表达式以获取该行的列。唯一乏味的部分应该是正则表达式,但这看起来不太可怕 – Jonesopolis

+1

你是认真的家伙吗? – 2013-06-24 20:03:31

回答

0

先用COMP拆分,抓住每个COMP,然后用换行符将COMP拆分成行。抓住第一行并添加。

string[] _compSplitted = text.Split(new string[] { "COMP"}, StringSplitOptions.Empty); 
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

+0

感谢您的回答。但是我在一周前完成了:)我解析了文件并读取了以“COMP”和“C_PIN”开头的行。然后我用“”(空格)分割它们。之后,我把我想要的浮动数字放到另一个数组中。然后将它们定义为PointF的坐标。但是,谢谢你的时间。如果你愿意,我可以在C#中分享代码。 –