0

我有一个包含博文的文本文件,每个博文都分为标题和内容,如下所示

    #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。

4

3 回答 3

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());
于 2012-11-09T18:18:49.623 回答
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;
    }
}

当然,这假设您的标题总是正好一行长(否则一个标题可能会导致您的 headers 变量中有多个条目)。

于 2012-11-09T18:26:49.413 回答
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>();
于 2012-11-09T18:37:55.110 回答