使用c#在特定单词后读取一行

时间:2017-02-02 19:17:10

标签: c#

我正在尝试解析文本文件并遇到问题。我需要在“MESSAGE”之后读一行。

该文件将包含以下示例数据。

MESSAGE
2005修理汽车驾驶员侧。

MESSAGE
1508修复水力悬浮液。

在这种情况下,我想阅读从2005年和1508年开始的行。

这是我的代码

List<Record> records = new List<Record>();

using (FileStream fs = new FileStream("SampleData.txt", FileMode.Open)) 
{
    using (StreamReader rdr = new StreamReader(fs))
    {
        string tempreadline;
        tempreadline = rdr.ReadLine();
        while (tempreadline != null)
        {
            if (tempreadline.Contains("MESSAGE")
               {
                     // what do I do here?
                     // skip "MESSAGE" line and read the next line
               }
        }
     }
}

有什么建议吗?谢谢!

2 个答案:

答案 0 :(得分:1)

方法1

使用您的方法。

Console.WriteLine("METHOD 1");

var records = new List<string>();

using (var fs = new FileStream("d:\\SampleData.txt", FileMode.Open))
{
    using (var rdr = new StreamReader(fs))
    {
        var msgFound = false;
        while (!rdr.EndOfStream)
        {
            var tempreadline = rdr.ReadLine();
            if (tempreadline.Contains("MESSAGE"))
            {
                msgFound = true;
            }
            else if (msgFound && !string.IsNullOrEmpty(tempreadline))
            {
                records.Add(tempreadline);
                msgFound = false;
            }
        }
    }
}

records.ForEach(r => Console.WriteLine(r));

方法2

假设您的文字是单个字符串。

Console.WriteLine("METHOD 2");

var text = File.ReadAllText("d:\\SampleData.txt");
records = text.Split(new[] { "MESSAGE" }, StringSplitOptions.RemoveEmptyEntries)
              .Select(t => t.Trim(' ', '\r', '\n'))
              .Where(t => !string.IsNullOrEmpty(t))
              .ToList();

records.ForEach(r => Console.WriteLine(r));

方法3

假设您的文字是字符串列表。

Console.WriteLine("METHOD 3");

var texts = File.ReadLines("d:\\SampleData.txt");
records = texts.Where(t => !string.IsNullOrEmpty(t) && !t.StartsWith("MESSAGE"))
               .ToList();

records.ForEach(r => Console.WriteLine(r));

方法4

使用正则表达式。

Console.WriteLine("METHOD 4");

records = new Regex(@"^MESSAGE[\s]*$", RegexOptions.IgnoreCase | RegexOptions.Multiline)
                .Split(text)
                .Select(t => t.Trim(' ', '\r', '\n'))
                .Where(t => !string.IsNullOrEmpty(t))
                .ToList();

records.ForEach(r => Console.WriteLine(r));

答案 1 :(得分:0)

如果所需内容位于文件中,您可以使用File.ReadAllLines方法(描述为here)和Linq扩展方法的组合,如下所示。数组DesiredLines可以进一步处理。

var DesiredLines = File.ReadAllLines("C:\FileName.txt")
                       .Where( iLine => iLine != "MESSAGE" && iLine != "")
                       .ToArray();