2017-04-08 84 views
-2

我有需要在C#中解析的文本格式。每次測試都必須一次解析一個。文本文件的格式如下:在C中解析複雜的格式#

T1 
    { 
    data1=3.5 
    data2=58% 
    data3=FAIL 
    } 

    T2 
    { 
     data1=7.5 
     data2=78% 
     data3=PASS 
    } 

的數據的類,將是這樣的:

Class data 
{ 
    double measure; 
    double percentage; 
    string testR; 
} 

解析文本文件,例如後,第一T1將量度= 3.5,百分比= 58%和testR =「FAIL」。我怎樣才能一次解析T1?

+1

請添加更多的信息,就像你的班級結構,你迄今爲止的嘗試.. –

+0

give more關於輸入文件的信息......很難以這種格式查找數據。 –

+0

因此,有一個文本文件包含格式化文本,如第一個代碼片段所示?你從什麼解析? – JohnG

回答

0

你可以做到這一點相當迅速和有效地與基於正則表達式LALR解析器:

string text = @" T1 
     { 
      data1=3.5 
      data2=58% 
      data3=FAIL 
     } 

     T2 
     { 
      data1=7.5 
      data2=78% 
      data3=PASS 
     }"; 
    string regex = "[ \n\r\t]*([^ \n\r\t{]*)[ \n\r\t]*{[ \n\r\t]*data1=([^ \n\r\t]*)[ \n\r\t]*data2=([^ \n\r\t]*)[ \n\r\t]*data3=([^ \n\r\t]*)[ \n\r\t]*}"; 
    while(System.Text.RegularExpressions.Regex.IsMatch(text, regex)) { 
     var match = System.Text.RegularExpressions.Regex.Match(text, regex); 
     Console.WriteLine($"Item name {match.Groups[1].Value}"); 
     Console.WriteLine($"Data1= {match.Groups[2].Value}"); 
     Console.WriteLine($"Data2= {match.Groups[3].Value}"); 
     Console.WriteLine($"Data3= {match.Groups[4].Value}"); 
     text = text.Substring(match.Groups[0].Value.Length); 
    } 

會得到以下的輸出:

Item name T1 
Data1= 3.5 
Data2= 58% 
Data3= FAIL 
Item name T2 
Data1= 7.5 
Data2= 78% 
Data3= PASS 

你可以看到如何使用正則表達式的更多信息這裏: https://regexone.com/references/csharp

0

您是如何解決這個問題的?你可以發佈你的代碼嗎?從本質上講,這並不難,但你需要跟蹤你在輸入文件中的位置,並且你需要將問題分解成小塊。一個好的開始將是能夠識別一次閱讀的開始和結束。它看起來像{和}可能會達到這個目的。