如何读取文本文件并打印符合所有条件的指定行?

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 个条件时,所有其他行都属于此事件:

结果应该是这样的:

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