如何读取文本文件并打印符合所有条件的指定行?
How do I read a text file and print specified lines which match all conditions?
我是 C# 新手。我正在尝试编写一个 winforms 应用程序,它读取一个文本文件并根据条件打印特定的行。例如,我有一个如下所示的文本文件:
07/10 08:15:00 EVENT: IN
07/10 08:15:00 BUILDING: A
07/10 08:15:00 ROOM: 101
07/10 08:15:00 MEMBER: JOHN, MARIA, PETER, SOPHIA
07/10 08:15:00 --------------------------------------
07/11 17:15:00 EVENT: OUT
07/11 17:15:00 BUILDING: B
07/11 17:15:00 ROOM: 102
07/11 17:15:00 MEMBER: ANDY, HAN, CINDY, LESTER
07/11 17:15:00 --------------------------------------
07/12 09:30:00 EVENT: IN
07/12 09:30:00 BUILDING: A
07/12 09:30:00 ROOM: 101
07/12 09:30:00 MEMBER: JIMMY, NICKY, EMILY, DANIEL
07/12 09:30:00 --------------------------------------
07/13 08:46:00 EVENT: IN
07/13 08:46:00 BUILDING: B
07/13 08:46:00 ROOM: 202
07/13 08:46:00 MEMBER: ROMEO, JULIET, WILLIAM
07/13 08:46:00 --------------------------------------
07/13 15:29:00 EVENT: IN
07/13 15:29:00 BUILDING: A
07/13 15:29:00 ROOM: 101
07/13 15:29:00 MEMBER: THOMAS, VIVIAN, KIM, SAMUEL
07/13 15:29:00 --------------------------------------
07/14 20:33:00 EVENT: OUT
07/14 20:33:00 BUILDING: A
07/14 20:33:00 ROOM: 301
07/14 20:33:00 MEMBER: JIMMY, NICKY, DANIEL
07/14 20:33:00 --------------------------------------
我想打印事件名称,当它符合以下所有 3 个条件时,所有其他行都属于此事件:
- 条件 1:事件:IN
- 条件 2:建筑物:A
- 条件3:房间:101
结果应该是这样的:
07/10 08:15:00 EVENT: IN
07/10 08:15:00 BUILDING: A
07/10 08:15:00 ROOM: 101
07/10 08:15:00 MEMBER: JOHN, MARIA, PETER, SOPHIA
07/10 08:15:00 --------------------------------------
07/12 09:30:00 EVENT: IN
07/12 09:30:00 BUILDING: A
07/12 09:30:00 ROOM: 101
07/12 09:30:00 MEMBER: JIMMY, NICKY, EMILY, DANIEL
07/12 09:30:00 --------------------------------------
07/15 10:11:00 EVENT: IN
07/15 10:11:00 BUILDING: A
07/15 10:11:00 ROOM: 101
07/15 10:11:00 MEMBER: THOMAS, VIVIAN, KIM, SAMUEL
07/15 10:11:00 --------------------------------------
这是我的代码:
private void btnSearch_Click(object sender, EventArgs e)
{
txtResult.Clear();
int counter = 0;
string line;
if (txtPath.Text != "")
{
StreamReader reader = new StreamReader(txtPath.Text);
while ((line = reader.ReadLine()) != null)
{
if (line.Contains("EVENT: IN"))
{
//problem at this line
txtResult.Text += line + "\r\n";
if ((line = reader.ReadLine()) != null)
{
if (line.Contains("BUILDING: A"))
{
txtResult.Text += line + "\r\n";
if ((line = reader.ReadLine()) != null)
{
if (line.Contains("ROOM: 101"))
{
txtResult.Text += line + "\r\n";
if ((line = reader.ReadLine()) != null)
txtResult.Text += line + "\r\n";
if ((line = reader.ReadLine()) != null)
txtResult.Text += line + "\r\n";
}
}
}
}
}
counter++;
}
reader.Close();
}
else
MessageBox.Show("Find not found!", "Message", MessageBoxButtons.OK);
}
问题是当它达到第一个条件时,它会打印所有包含单词 'EVENT: IN' 的行,如下所示:
07/10 08:15:00 EVENT: IN
07/10 08:15:00 BUILDING: A
07/10 08:15:00 ROOM: 101
07/10 08:15:00 MEMBER: JOHN, MARIA, PETER, SOPHIA
07/10 08:15:00 --------------------------------------
07/12 09:30:00 EVENT: IN
07/12 09:30:00 BUILDING: A
07/12 09:30:00 ROOM: 101
07/12 09:30:00 MEMBER: JIMMY, NICKY, EMILY, DANIEL
07/12 09:30:00 --------------------------------------
07/13 08:46:00 EVENT: IN
07/13 15:29:00 EVENT: IN
07/15 10:11:00 EVENT: IN
07/15 10:11:00 BUILDING: A
07/15 10:11:00 ROOM: 101
07/15 10:11:00 MEMBER: DONALD, GARETH, BOBBY
07/15 10:11:00 --------------------------------------
我的问题是如何只打印符合所有 3 个条件的行?
感谢帮助!
这是一种简单的方法。我只是在控制台应用程序中完成了这个,因此您可以替换对 Console.WriteLine
的调用以写入您的 TextBox
。它不完全是“最佳”解决方案,但由于您本质上需要编写一个简单的解析器,因此它应该可以帮助您入门。
string file = @"<path to your file>";
string[] lines = File.ReadAllLines(file);
//Check the file in blocks of 5 lines, from the "EVENT" line through the "-------" line
//Assumes file structure is always consistent
for (int i = 0; i < lines.Length; i += 5)
{
string eventLine = lines[i];
string buildingLine = lines[i + 1];
string roomLine = lines[i + 2];
if (eventLine.EndsWith("EVENT: IN") &&
buildingLine.EndsWith("BUILDING: A") &&
roomLine.EndsWith("ROOM: 101"))
{
Console.WriteLine(lines[i]); //EVENT: IN
Console.WriteLine(lines[i + 1]); //BUILDING: A
Console.WriteLine(lines[i + 2]); //ROOM: 101
Console.WriteLine(lines[i + 3]); //MEMBER: <list of members>
Console.WriteLine(lines[i + 4]); //-------------------------
}
}
我是 C# 新手。我正在尝试编写一个 winforms 应用程序,它读取一个文本文件并根据条件打印特定的行。例如,我有一个如下所示的文本文件:
07/10 08:15:00 EVENT: IN
07/10 08:15:00 BUILDING: A
07/10 08:15:00 ROOM: 101
07/10 08:15:00 MEMBER: JOHN, MARIA, PETER, SOPHIA
07/10 08:15:00 --------------------------------------
07/11 17:15:00 EVENT: OUT
07/11 17:15:00 BUILDING: B
07/11 17:15:00 ROOM: 102
07/11 17:15:00 MEMBER: ANDY, HAN, CINDY, LESTER
07/11 17:15:00 --------------------------------------
07/12 09:30:00 EVENT: IN
07/12 09:30:00 BUILDING: A
07/12 09:30:00 ROOM: 101
07/12 09:30:00 MEMBER: JIMMY, NICKY, EMILY, DANIEL
07/12 09:30:00 --------------------------------------
07/13 08:46:00 EVENT: IN
07/13 08:46:00 BUILDING: B
07/13 08:46:00 ROOM: 202
07/13 08:46:00 MEMBER: ROMEO, JULIET, WILLIAM
07/13 08:46:00 --------------------------------------
07/13 15:29:00 EVENT: IN
07/13 15:29:00 BUILDING: A
07/13 15:29:00 ROOM: 101
07/13 15:29:00 MEMBER: THOMAS, VIVIAN, KIM, SAMUEL
07/13 15:29:00 --------------------------------------
07/14 20:33:00 EVENT: OUT
07/14 20:33:00 BUILDING: A
07/14 20:33:00 ROOM: 301
07/14 20:33:00 MEMBER: JIMMY, NICKY, DANIEL
07/14 20:33:00 --------------------------------------
我想打印事件名称,当它符合以下所有 3 个条件时,所有其他行都属于此事件:
- 条件 1:事件:IN
- 条件 2:建筑物:A
- 条件3:房间:101
结果应该是这样的:
07/10 08:15:00 EVENT: IN
07/10 08:15:00 BUILDING: A
07/10 08:15:00 ROOM: 101
07/10 08:15:00 MEMBER: JOHN, MARIA, PETER, SOPHIA
07/10 08:15:00 --------------------------------------
07/12 09:30:00 EVENT: IN
07/12 09:30:00 BUILDING: A
07/12 09:30:00 ROOM: 101
07/12 09:30:00 MEMBER: JIMMY, NICKY, EMILY, DANIEL
07/12 09:30:00 --------------------------------------
07/15 10:11:00 EVENT: IN
07/15 10:11:00 BUILDING: A
07/15 10:11:00 ROOM: 101
07/15 10:11:00 MEMBER: THOMAS, VIVIAN, KIM, SAMUEL
07/15 10:11:00 --------------------------------------
这是我的代码:
private void btnSearch_Click(object sender, EventArgs e)
{
txtResult.Clear();
int counter = 0;
string line;
if (txtPath.Text != "")
{
StreamReader reader = new StreamReader(txtPath.Text);
while ((line = reader.ReadLine()) != null)
{
if (line.Contains("EVENT: IN"))
{
//problem at this line
txtResult.Text += line + "\r\n";
if ((line = reader.ReadLine()) != null)
{
if (line.Contains("BUILDING: A"))
{
txtResult.Text += line + "\r\n";
if ((line = reader.ReadLine()) != null)
{
if (line.Contains("ROOM: 101"))
{
txtResult.Text += line + "\r\n";
if ((line = reader.ReadLine()) != null)
txtResult.Text += line + "\r\n";
if ((line = reader.ReadLine()) != null)
txtResult.Text += line + "\r\n";
}
}
}
}
}
counter++;
}
reader.Close();
}
else
MessageBox.Show("Find not found!", "Message", MessageBoxButtons.OK);
}
问题是当它达到第一个条件时,它会打印所有包含单词 'EVENT: IN' 的行,如下所示:
07/10 08:15:00 EVENT: IN
07/10 08:15:00 BUILDING: A
07/10 08:15:00 ROOM: 101
07/10 08:15:00 MEMBER: JOHN, MARIA, PETER, SOPHIA
07/10 08:15:00 --------------------------------------
07/12 09:30:00 EVENT: IN
07/12 09:30:00 BUILDING: A
07/12 09:30:00 ROOM: 101
07/12 09:30:00 MEMBER: JIMMY, NICKY, EMILY, DANIEL
07/12 09:30:00 --------------------------------------
07/13 08:46:00 EVENT: IN
07/13 15:29:00 EVENT: IN
07/15 10:11:00 EVENT: IN
07/15 10:11:00 BUILDING: A
07/15 10:11:00 ROOM: 101
07/15 10:11:00 MEMBER: DONALD, GARETH, BOBBY
07/15 10:11:00 --------------------------------------
我的问题是如何只打印符合所有 3 个条件的行?
感谢帮助!
这是一种简单的方法。我只是在控制台应用程序中完成了这个,因此您可以替换对 Console.WriteLine
的调用以写入您的 TextBox
。它不完全是“最佳”解决方案,但由于您本质上需要编写一个简单的解析器,因此它应该可以帮助您入门。
string file = @"<path to your file>";
string[] lines = File.ReadAllLines(file);
//Check the file in blocks of 5 lines, from the "EVENT" line through the "-------" line
//Assumes file structure is always consistent
for (int i = 0; i < lines.Length; i += 5)
{
string eventLine = lines[i];
string buildingLine = lines[i + 1];
string roomLine = lines[i + 2];
if (eventLine.EndsWith("EVENT: IN") &&
buildingLine.EndsWith("BUILDING: A") &&
roomLine.EndsWith("ROOM: 101"))
{
Console.WriteLine(lines[i]); //EVENT: IN
Console.WriteLine(lines[i + 1]); //BUILDING: A
Console.WriteLine(lines[i + 2]); //ROOM: 101
Console.WriteLine(lines[i + 3]); //MEMBER: <list of members>
Console.WriteLine(lines[i + 4]); //-------------------------
}
}