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

もちろん、これはヘッダーが常に正確に 1 行の長さであることを前提としています (そうでない場合、1 つのヘッダーがヘッダー変数に複数のエントリをもたらす可能性があります)。

于 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 に答える