搜索标题并将该标题放在列表中

时间:2012-11-09 18:10:45

标签: c# linq text-files

我有一个带有博客帖子的文本文件,每个博文分为标题和内容,如下所示

    #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是首选。

3 个答案:

答案 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)

您可以将regexLINQ

一起使用
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>();