2012-11-09 17 views
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是首選。

回答

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()); 
+0

兩個偉大工程:) – Inzajt

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

當然這是假設日在你的頭文件中總是隻有一行(否則一個頭文件可能會導致頭文件變量中有多個條目)。

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>(); 
相關問題