我有一个带有博客帖子的文本文件,每个博文分为标题和内容,如下所示
#Header
A post
#Content
My content goes here...
#Header
Another post
#Content
My content goes here...
现在我想抓住所有标题,#Header之后和#Content之前的文本并将其放在List<>
中。我怎么能这样做?
这是我到目前为止所提出的:
var headers = new List<string>();
using (StreamReader reader = new StreamReader(Path))
{
string line;
while ((line = reader.ReadLine()) != null)
{
headers.AddRange(line)
.SkipWhile(l => l != "#Header")
.Skip(1)
.TakeWhile(l => !l.StartsWith("#"))
.ToList();
}
}
Linq是首选。
答案 0 :(得分:1)
未经测试,但是这样的事情怎么样(假设文件不是 长):
var headers = reader.ReadToEnd()
.Split(new[]{"#Header"}, StringSplitOptions.RemoveEmptyEntries)
.Select(x => x.Split(new[]{"#Content"})[0].Trim())
.ToList();
或者,如果文件很长,则逐行阅读:
List<string> headers = new List<string>();
string line;
bool inHeader = false;
StringBuilder header = new StringBuilder();
while((line = reader.ReadLine()) != null)
{
if(!inHeader)
{
if (line == "#Header") inHeader = true;
}
else if (line == "#Content")
{
headers.Add(header.ToString());
header.Clear();
inHeader = false;
}
else
{
header.AppendLine(line);
}
}
if(inHeader) headers.Add(header.ToString());
答案 1 :(得分:0)
假设您的文件可能很长:
bool header = false;
while(line = reader.readLine())
{
if(header) headers.add(line);
if(String.Compare(line,"#Header", false) == 0)
{
header = true;
}
else if(String.Compare(line,"#Content", false) == 0)
{
header = false;
}
}
当然,这假设您的标题总是正好一行(否则一个标题可能会导致标题变量中出现多个条目)。
答案 2 :(得分:0)
您可以将regex
与LINQ
string contents = File.ReadAllText("yourTextFile.txt");
List<string> header=Regex.Matches(contents,@"#Header\s*(.*?)\s*#",RegexOptions.IgnoreCase | RegexOptions.Singleline)
.Cast<Match>()
.Select(x=>x.Groups[1].Value).ToList<string>();