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

时间:2014-07-31 08:13:13

标签: c#

我正在尝试在文本文件中搜索字符串,一旦找到此字符串,我需要显示此行,然后还显示前面的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);
         }
    }
}

4 个答案:

答案 0 :(得分:1)

您可以继续缓存这些行,直到找到您要查找的行:

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

}

答案 1 :(得分:1)

这可能是你想要的:

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

下面的代码将打开文件,搜索您想要的行,然后将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]);
}