使用streamreader找到一行后如何读取下x行

Joh*_*ohn 2 c# streamreader

我想在文本文件中搜索包含“Performance Stats:”的行,然后打印接下来的 20 行左右,因为它们是性能统计表。我正在使用 Streamreader。

string pathToFile = "\\host\c$\temp\logs\myPerformanceFile.txt"

using (var filestream = new FileStream(pathToFile, FileMode.Open, FileAccess.Read,                               FileShare.ReadWrite))
using (var streamReader = new StreamReader(filestream, Encoding.Default))
{
    string line;
    while ((line = streamReader.ReadLine()) != null)
    {
        if (line.Contains("Performance Stats:"))
        {
            Console.WriteLine(line)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图找到每个统计数据的标题栏。但 20 行看起来有点混乱,例如,我正在使用相同的搜索参数解析文件中有 5 个表。但我只想要其中一个表中的数据。

        if (line.Contains("Timings:"))
        {
            Console.WriteLine(line)
        }
        if (line.Contains("Downloads:")) 
        {
            Console.WriteLine(line)
        }
        if (line.Contains("Reset")) 
        {
            Console.WriteLine(line)
        }
Run Code Online (Sandbox Code Playgroud)

Tim*_*ter 5

我会使用File.ReadLines它也在引擎盖下“流式传输”行,因此不会一次读取所有行。您可以使用 LINQ 来简化它并返回自定义类PerformanceStats

public class PerformanceStats
{
    public string Timings{get; set;}
    public string Downloads{get; set;}
    public string Reset{get; set;}
}

void Main()
{
    PerformanceStats stats = GetPerformanceStats(@"\\host\c$\temp\logs\myPerformanceFile.txt");
}

static PerformanceStats GetPerformanceStats(string filePath)
{
    if(!System.IO.File.Exists(filePath))
    {
        return null;
    }
    
    StringComparison comparer = StringComparison.InvariantCultureIgnoreCase;
    string[] properties = {"Timings:", "Downloads:", "Reset:"};
    List<string> lines = System.IO.File.ReadLines(filePath)
        .SkipWhile(line => !line.Contains("Performance Stats:", comparer))
        .Take(20) // or 21 since it starts at the "Performance Stats"-line
        .Where(line => properties.Any(p => line.Contains(p, comparer)))
        .ToList();

    return new PerformanceStats
    {
        Timings = lines.FirstOrDefault(l => l.Contains("Timings:", comparer)),
        Downloads = lines.FirstOrDefault(l => l.Contains("Downloads:", comparer)),
        Reset = lines.FirstOrDefault(l => l.Contains("Reset:", comparer))
    };
}
Run Code Online (Sandbox Code Playgroud)