2013-06-24 97 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#中分享代碼。 –