解析半格式化文件

本文关键字:文件 格式化 | 更新日期: 2023-09-27 18:09:02

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

我的想法(虽然我还没有弄清楚如何编码它),是由于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;
                                }
                            }
                        }

解析半格式化文件

我想这应该适合你。至少它应该给你一个提示:

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
        }
    }
}