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();
         }

上記は、著者の詳細を 1 つだけ返します。オブジェクトに入力できるように、すべての作成者を一度に取得する方法を教えてください。どうもありがとう!!

4

2 に答える 2

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 に答える
0

最初にぶつかったところで止まり}ます。

ビットを削除する.TakeWhile(line => line != endto)と、うまくいくはずです。

于 2012-06-07T18:49:49.877 に答える