在C#中附加到文本文件的行的上方和下方写入n行

时间:2014-03-26 14:58:45

标签: c#

在我正在处理的应用程序中,我创建了关键字搜索器。用户上传文本文件(因为这是为了工作,它将是一个包含数千行消息的txt文件),并且可以输入多个单词进行搜索,应用程序将使用相应的输入拉出任何行。唯一的问题是,他们希望能够在被复制的行的上方和下方拉出n行,这样他们就可以看到被拉的消息的上下文。有没有办法说这行和上面和下面的n行?下面是我搜索单词并编写单词的代码。

 private void button12_Click(object sender, EventArgs e)
 {
     string[] sArray = System.IO.File.ReadAllLines(textBox7.Text);
     StringBuilder sb = new StringBuilder();

     foreach (string line in sArray)
     {
          if (Regex.IsMatch(line, (textBox9.Text), RegexOptions.IgnoreCase) && !string.IsNullOrWhiteSpace(textBox9.Text))
          {
              sb.AppendLine(line);
          }

          if (Regex.IsMatch(line, (textBox10.Text), RegexOptions.IgnoreCase) && !string.IsNullOrWhiteSpace(textBox10.Text))
          {
              sb.AppendLine(line);
          }
        }

        using (StreamWriter sw = new StreamWriter(textBox8.Text))
        {
            sw.Write(sb);
        }
    }
}

2 个答案:

答案 0 :(得分:2)

我提供了一个小例子。您可以像这样使用它:

List<string> lines = new List<string>() {"This", "is", "some", "test", "data"};
List<string> result = GetMatchingLines(lines, "test", 2, 2);

方法如下:

/// <summary>
/// Gets all lines containing the "match" including "before" lines before and "after" lines after.
/// </summary>
/// <param name="lines">The original lines.</param>
/// <param name="match">The match that shall be found.</param>
/// <param name="before">The number of lines before the occurence.</param>
/// <param name="after">The number of lines after the occurence.</param>
/// <returns>All lines containing the "match" including "before" lines before and "after" lines after.</returns>
private List<string> GetMatchingLines(List<string> lines, string match, int before = 0, int after = 0)
{
    List<string> result = new List<string>();

    for (int i = 0; i < lines.Count; i++)
    {
        if (string.IsNullOrEmpty(lines[i]))
        {
            continue;
        }

        if (Regex.IsMatch(lines[i], match, RegexOptions.IgnoreCase))
        {
            for (int j = i - before; j < i + after; j++)
            {
                if (j >= 0 && j < lines.Count)
                {
                    result.Add(lines[j]);
                }
            }
        }
    }

    return result;
}

考虑到您的代码,方法将以某种方式调用:

string[] lines = File.ReadAllLines(textBox7.Text);
List<string> result = new List<string>();

if (!string.IsNullOrEmpty(textBox9.Text))
{
    result.AddRange(GetMatchingLines(lines.ToList(), textBox9.Text, 2, 2));
}

if (!string.IsNullOrEmpty(textBox10.Text))
{
    result.AddRange(GetMatchingLines(lines.ToList(), textBox10.Text, 2, 2));
}

File.WriteAllLines(textBox8.Text, result);

答案 1 :(得分:0)

由于您正在查找行之间存在整数差异的不同行,因此您可能希望将foreach修改为for

这可以让你说出像

这样的话
var thisLine = sArray[i];
var oneLineBefore = sArray[i-1];
var oneLineAfter = sArray[i+1];
sb.Append(oneLineBefore);
sb.Append(thisLine);
sb.Append(oneLineAfter);

显然,在访问之前,请确保检查以确保存在之前和之后的行。