0

我正在尝试阅读以下文本文件:

    Author
    {
    Name  xyz
    blog  www.test.com
    rating 123
    }    
   Author
    {
    Name  xyz
    blog  www.test.com
    rating 123
    }   
    Author
    {
    Name  xyz
    blog  www.test.com
    rating 123
    }   
    Author
    {
    Name  xyz
    blog  www.test.com
    rating 123
    }

我正在使用以下代码段来获取我的作者记录:

  public static IEnumerable<string> GetAuthors(string path, string startfrom, string endto)
        {
            return File.ReadLines(path)
                .SkipWhile(line => line != startfrom)
                .TakeWhile(line => line != endto);
        }



 public static void DoSomethingWithAuthors(string fileName)
        {
            var result = GetAuthors(fileName, "AUTHOR", "}").ToList();
         }

以上仅返回我一个作者详细信息。有人可以告诉我如何一次性获取所有作者,以便我可以填充到一个对象。非常感谢!!

4

2 回答 2

0

它会在}它遇到的第一个地方停下来。

取下.TakeWhile(line => line != endto)钻头,它应该适合你。

于 2012-06-07T18:49:49.877 回答
0

我很少建议这样做,但如果文件结构是可预测的,您甚至可以使用正则表达式来获取您的作者详细信息。由于您要初始化的对象并不复杂,您可以匹配该Author位并从正则表达式匹配组中获取值。

匹配作者的正则表达式是这样的:

Author\s*{\s*Name\s+(.*?)\s+blog\s+(.*?)\s+rating\s+(.*?)\s*}

您的值将在组 1,2 和 3 中。

编辑:

如果它对您没有影响,您可以使用 ReadToEnd() 方法,然后您可以将整个文件内容解析为字符串:http:
//msdn.microsoft.com/en-us/library/system。 io.streamreader.readtoend(v=vs.100).aspx

至于正则表达式解决方案 - 看看这个:http:
//msdn.microsoft.com/en-us/library/twcw2f1c.aspx

改编版本 - 它可能需要调整,但通常它应该可以工作:

string text = [yourInputFileAsString]
      string pat = @"Author\s*{\s*Name\s+(.*?)\s+blog\s+(.*?)\s+rating\s+(.*?)\s*}";

      Regex r = new Regex(pat, RegexOptions.IgnoreCase | RegexOptions.Singleline);

      Match m = r.Match(text);

      var authors = new List<Author>();
      while (m.Success) 
      {
         var name = m.Groups[1].Value;
         var blog = m.Groups[2].Value;
         var rating = m.Groups[3].Value;
         var author = new Author(name, blog, rating);
         authors.Add(author);

         m = m.NextMatch();
      }
于 2012-06-07T19:43:47.650 回答