我正在尝试阅读以下文本文件:
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();
}
以上只返回一个作者详细信息。有人可以告诉我如何一次性获取所有作者,以便我可以弹出一个对象。非常感谢你!!
答案 0 :(得分:0)
它将在它遇到的第一个}
处停止。
删除.TakeWhile(line => line != endto)
位,它应该适合你。
答案 1 :(得分: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();
}