【问题标题】:Read a preceding line of a text file; if current line contains "X"读取文本文件的前一行;如果当前行包含“X”
【发布时间】:2015-10-29 11:33:56
【问题描述】:

目前,我正在读取特定条目“X”的文件。 找到此条目后,我可以在以下任何行中执行我需要执行的操作,但是在“X”出现之前需要 2 行的一条信息。 现在我可以使用var line = reader.ReadLine(); 在文件中前进并读取“X”之后的行。我如何回到前 2 行读取该数据?

while (!reader.EndOfStream)
{
    var line = reader.ReadLine();

    if (line.Contains("X"))
    {
        Processing
    }
}

【问题讨论】:

    标签: c# text-files streamreader


    【解决方案1】:

    边走边保存:

    string prev1;
    string prev2;
    
    while (!reader.EndOfStream)
    {
    
        var line = reader.ReadLine();
    
        if (line.Contains("X"))
        {
            Processing
        }
    
        prev2 = prev1;
        prev1 = line;
    }
    

    如果您需要的不止这些,它可以很容易地转换成一个队列,您可以从中推/拉。

    【讨论】:

    • 如果我这样做了,我是否再次将该行设置在包含“X”的行的前面?我是否需要将该行放回“X”下方以防止再次读取它?
    • @user2399216:不 - 实际读取的文件本身不受影响,您只是将先前读取的行缓存到内存中。
    • 它打破了循环。我需要继续检查文档中的“X”,因为它是呈现独特结果的标记。 “X”会出现多次,每次都需要收集其独特的周边数据
    • @user2399216:给定的循环样式将对每次出现的“X”执行此操作(即捕获包含 X 的行之前的 2 行)。
    【解决方案2】:

    你可以使用File.ReadAllLines而不是StreamReader,它返回一个字符串数组:

    string[] lines = File.ReadAllLines("file.txt")
    for (int i = 0; i < lines.Length; i++)
    {
        if (lines[i].Contains("X") && i >= 2)
        {
             string res = lines[i-2];
        } 
    }
    

    【讨论】:

    • 这回答了我当前的问题加上另一个奖励点
    【解决方案3】:

    【讨论】:

      【解决方案4】:

      存储前 2 行:

      string [] lineprev = new string[]{"",""} ;
      while (!reader.EndOfStream)
      {
          var line = reader.ReadLine();
          if (line.Contains("X"))
          {
              // Processing : Find info in lineprev[1]
          }
          lineprev[1]=lineprev[0] ;
          lineprev[0]= line ;
      }
      

      【讨论】:

        【解决方案5】:

        尽量将前一行保留在内存中,以便在需要时访问它。 像这样的:

        var prev;
        while (!reader.EndOfStream)
        {
            var line = reader.ReadLine();
        
            if (line.Contains("X")) {
                // Processing both line and prev
            }
        
            prev = line; // remember previous line for future use
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-27
          • 2010-12-03
          • 1970-01-01
          相关资源
          最近更新 更多