在C#中将文本文件解析为数组

时间:2013-06-24 20:00:06

标签: c# parsing file-io

我想将一个关于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”开头的行。我想将所有信息写入一个数组。

3 个答案:

答案 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