解析一个半格式文件

问题描述:

我一直在试图找到一个很好的方法来解析我经常看到的文本文件。问题不在于解析简单的一行部分,而是跨越多行并偶尔包含诸如:之类的字符。第二个问题是偶尔会在下一部分之前出现一个不作为value:key pair的随机行。解析一个半格式文件

我的想法(尽管我还没有想出如何编码),因为SECTION值是已知的,所以它们可以在List<string>中提供,并且这将允许解析经过一段直到到达List<string>中的另一个值。这就是我迄今为止试图用我的代码所做的。

我需要什么主要是搞清楚多的问题,其次在词典(List<Dictionary>)的列表存储一切每个部分存储在它自己的字典帮助(或者,如果有人有更好的主意,通过各种手段) 。

示例文字:

Lorem ipsum dolor sit amet, consectetur adipisicing 
elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut 
enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut 
aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in 
voluptate velit esse cillum dolore eu fugiat nulla pariatur. 

SECTION1 
    VALUE1: incididunt ut labore 
    VALUE2: nostrud 
    VALUE3: eiusmod tempor 
    VALUE4: Excepteur sint occaecat cupidatat non proident, sunt in 
culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor 
sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut 
labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud 
exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. 
    VALUE5: Duis aute irure dolor in reprehenderit in voluptate 
velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat 
cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id 
est laborum. 

Lorem ipsum dolor sit amet, consectetur adipisicing 
elit, sed do eiusmod tempor incididunt ut labore et dolore magna 
aliqua. 
SECTION2 
    VALUE1: incididunt ut labore 
    VALUE2: nostrud 
    VALUE3: eiusmod tempor 
    VALUE4: Excepteur sint occaecat cupidatat non proident, sunt in 
culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor 
sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut 
labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud 
exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. 
    VALUE5: Duis aute irure dolor in reprehenderit in voluptate 
velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat 
cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id 
est laborum. 

示例代码:

     bool Sec1 = false; 
         bool Sec2 = false; 

         for (int i = 0; i < lines.Length; i++) 
         { 

          if (lines[i].Equals("SECTION1") || Sec1 == true) 
          { 
           if (lines[i + 1].StartsWith(" ")) 
           { 
            MessageBox.Show(lines[i + 1].Trim()); 
            Sec1 = true; 
           } 
           else 
           { 
            Sec1 = false; 
           } 
          } 
          else if (lines[i].Equals("SECTION2") || Sec2 == true) 
          { 
           if (lines[i + 1].StartsWith(" ")) 
           { 
            MessageBox.Show(lines[i + 1].Trim()); 
            Sec2 = true; 
           } 
           else 
           { 
            Sec2 = false; 
           } 
          } 
         } 
+0

你看过YAML吗? –

+0

没有。 *检查* – lordzero

+0

不知道它是如何工作的,考虑到我对YAML的理解(有限)是它有一个预定义的语法。我无法控制原始格式(否则我会选择相当不同的东西)。多行字符的缺乏已经成为一个主要障碍。 – lordzero

我认为这应该为你工作。至少它应该给你一个提示:

private void Parse() 
{ 
    var Dictionary = new List<List<string>>(); 
    var Section = new List<string>(); 

    using (var sr = new StreamReader(this.fileName)) 
    { 
     while (sr.Peek() > -1) 
     { 
      var line = sr.ReadLine().Trim(); 

      if (line.StartsWith("SECTION") && Section.Count > 0) 
      { 
       Dictionary.Add(Section); //// Store previous section 
       Section = new List<string>(); 
      } 

      if (line.StartsWith("VALUE")) 
      { 
       line = line.Remove(0, line.IndexOf(' ')); 
       Section.Add(line.Trim()); 
      } 
     } 

     if (Section.Count > 0) 
     { 
      Dictionary.Add(Section); //// Store last section 
     } 
    } 
} 
+0

Alina,我很感激你花时间回答这个问题。虽然我看到了一些问题。 1)字典在使用时不起作用(尤其是因为它会让VALUE的类型未知)。为每个值创建一个对象并将其存储在SECTION中可能更有意义,这将允许保留多个非唯一键值对 2)这对多线值没有任何帮助,这是我最大的问题。 3)虽然看起来我可以更清楚地描述这个VALUE,但它只是在后面定义: – lordzero