我需要帮助我正在实习的程序。 我们的想法是检查用户登录任何PC的频率。 当用户登录时,该信息将记录在文本文件中,如此格式。
01-01-2011 16:47:10-002481C218B0-WS3092-Chsbe (XP-D790PRO1)
现在我需要搜索文本文件并(例如)在文本文件中搜索用户Chsbe的所有登录日期。
到目前为止我的代码:
private void btnZoek_Click(object sender, EventArgs e)
{
int counter = 0; string line;
// Read the file and display it line by line.
System.IO.StreamReader file = new System.IO.StreamReader("c:\\log.txt");
while((line = file.ReadLine()) != null)
{ if ( line.Contains(txtZoek.Text) )
{
txtResult.Text = line.ToString();
}
}
file.Close();
}
我的问题是,如何将包含searchterm的日志中的所有字符串返回给txtResult?
答案 0 :(得分:6)
你已经做得很好。唯一的错误是写入最后一行读入文本框,覆盖前一行
您需要在您的一次性Stream周围使用StringBuilder和using
语句,如下所示:
private void btnZoek_Click(object sender, EventArgs e)
{
int counter = 0; string line;
StringBuilder sb = new StringBuilder();
// Read the file and display it line by line.
using(System.IO.StreamReader file = new System.IO.StreamReader("c:\\log.txt"))
{
while((line = file.ReadLine()) != null)
{
if ( line.Contains(txtZoek.Text) )
{
// This append the text and a newline into the StringBuilder buffer
sb.AppendLine(line.ToString());
}
}
}
txtResult.Text = sb.ToString();
}
当然,你的txtResult应该将属性MultiLine设置为true,否则你将无法看到输出。
请记住,using
是处理此类情况的更好方法,因为它会自动处理意外关闭您的Stream的意外文件异常
答案 1 :(得分:0)
使用richtextbox或使用多行属性 例如
private void btnZoek_Click(object sender, EventArgs e)
{
int counter = 0; string line;
// Read the file and display it line by line.
System.IO.StreamReader file = new System.IO.StreamReader("c:\\log.txt");
while((line = file.ReadLine()) != null)
{ if ( line.Contains(txtZoek.Text) )
{
richtextbox1.Text += "\n" + line.ToString();
txtresult.Text += "\n" + line.ToString();
}
}
file.Close();
}
答案 2 :(得分:0)
定义列表
列出yourList = new List();
替换线
txtResult.Text = line.ToString();
通过
yourList.Add(线);
在列表“yourList”中,您获得了包含用户的所有行
答案 3 :(得分:0)
以下内容可能有助于您开始使用正则表达式:
string pattern = "Chsbe";
Regex rx = new Regex(pattern, RegexOptions.IgnoreCase);
MatchCollection mc = rx.Matches(inputText);
foreach (Match m in mc)
{
Console.WriteLine(m.Value);
}
答案 4 :(得分:0)
private void btnZoek_Click(object sender, EventArgs e)
{
int counter = 0; string line;
StringBuilder str = new StringBuilder();
// Read the file and display it line by line.
System.IO.StreamReader file = new System.IO.StreamReader("c:\\log.txt");
while((line = file.ReadLine()) != null)
{
if (line.Contains(txtZoek.Text))
{
str.Append(line.ToString());
}
}
file.Close();
}
答案 5 :(得分:0)
也许这样的事情会起作用。
private void btnZoek_Click(object sender, EventArgs e)
{
int counter = 0; string line;
// Read the file and display it line by line.
System.IO.StreamReader file = new System.IO.StreamReader("c:\\log.txt");
while((line = file.ReadLine()) != null)
{ if ( line.Contains(txtZoek.Text) )
{
txtResult.Text = txtResult.Text + Environment.Newline + line.ToString();
}
}
file.Close();
}
这将是我的版本:
private void btnZoek_Click(object sender, EventArgs e)
{
try
{
int counter = 0;
string line;
List<String> LinesFound = new List<string>();
// Read the file and display it line by line.
System.IO.StreamReader file = new System.IO.StreamReader("c:\\log.txt");
while ((line = file.ReadLine()) != null)
{
if (line.Contains(txtZoek.Text))
{
LinesFound.Add(line);
}
}
file.Close();
foreach (string Line in LinesFound)
{
txtResult.Text = txtResult.Text + Line + Environment.NewLine;
}
}
catch (Exception)
{
MessageBox.Show("Error in btnZoek_Click");
}
}
如果列表很长,我会使用StringBuilder创建一个结果字符串作为性能加速。
答案 6 :(得分:0)
尝试更改此行 - &gt;
txtResult.Text = line.ToString();
为:
txtResult.Text += line.ToString();