2017-04-08 56 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

您是如何解决这个问题的?你可以发布你的代码吗?从本质上讲,这并不难,但你需要跟踪你在输入文件中的位置,并且你需要将问题分解成小块。一个好的开始将是能够识别一次阅读的开始和结束。它看起来像{和}可能会达到这个目的。