在我正在处理的应用程序中,我创建了关键字搜索器。用户上传文本文件(因为这是为了工作,它将是一个包含数千行消息的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);
}
}
}
答案 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);
显然,在访问之前,请确保检查以确保存在之前和之后的行。