如何搜索:在文件中搜索字符串,显示包含该字符串的行以及它前面的6行

本文关键字:搜索 字符串 何搜索 包含该 6行 前面 显示 文件 | 更新日期: 2023-09-27 18:15:41

我试图通过文本文件搜索字符串,一旦我找到了这个字符串,我需要显示这一行,然后还显示前面的6行,即这将包含有关字符串中错误消息的详细信息。我一直在寻找类似的代码,并发现以下代码,但它不符合我的要求,只是想知道是否有可能做到这一点。

谢谢,约翰。

private static void Main(string[] args)
{
    string cacheline = "";
    string line;
    System.IO.StreamReader file = new   
    System.IO.StreamReader(@"D:'Temp'AccessOutlook.txt");
    List<string> lines = new List<string>();
    while ((line = file.ReadLine()) != null)
    {
         if (line.Contains("errors"))
         {
             lines.Add(cacheline);
         }
         cacheline = line;
         }
         file.Close();
         foreach (var l in lines)
         {
            Console.WriteLine(l);
         }
    }
}

如何搜索:在文件中搜索字符串,显示包含该字符串的行以及它前面的6行

这可能就是你想要的:

static void Main(string[] args)
{
    Queue<string> lines = new Queue<string>();
    using (var reader = new StreamReader(args[0]))
    {
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            if (line.Contains("error"))
            {
                Console.WriteLine("----- ERROR -----");
                foreach (var errLine in lines)
                    Console.WriteLine(errLine);
                Console.WriteLine(line);
                Console.WriteLine("-----------------");
            }
            lines.Enqueue(line);
            while (lines.Count > 6)
                lines.Dequeue();
        }
    }
}

你可以一直缓存这些行,直到找到你要找的行:

using(var file = new StreamReader(@"D:'Temp'AccessOutlook.txt"))
{
    List<string> lines = new List<string>();
    while ((line = file.ReadLine()) != null)
    {
        if (!line.Contains(myString))
        {
           lines.Add(line);
        } 
        else 
        {
            Console.WriteLine(string.Join(Environment.NewLine, lines.Concat(new[] { line })));
        }
        if(lines.Count > 6) lines.RemoveAt(0);
     }
}
string filename = "filename"; // Put your own filename here.
string target   = "target"; // Put your target string here.
int numLinesToShow = 7;
var lines = File.ReadAllLines(filename);
int index = Array.FindIndex(lines, element => element.Contains(target));
if (index >= 0)
{
    int start = Math.Max(0, index - numLinesToShow + 1);
    var result = lines.Skip(start).Take(numLinesToShow).ToList();
    // Use result.
}

下面的代码将打开文件,搜索您想要的行,然后将前面的6行写入控制台。

var lines = File.ReadAllLines(filePath);
int lineIndex;
for (lineIndex = 0; lineIndex < lines.Length - 1; lineIndex++)
{
    if (lines[lineIndex] == textToFind)
    {
        break;
    }
}
var startLine = Math.Max(0, lineIndex - 6);
for (int i = startLine; i < lineIndex; i++)
{
    Console.WriteLine(lines[i]);
}