2012-12-30 159 views
2

我正在尝试获取包含特定单词的行之前的行的列表。这是我的脚本:从文件中读取特定行

private static void Main(string[] args) 
{ 
    int counter = 0; 
    string line; 

    System.IO.StreamReader file = new System.IO.StreamReader("E:\\overview2.srt"); 
    List<string> lines = new List<string>(); 
    while ((line = file.ReadLine()) != null) 
    { 
     if (line.Contains("medication")) 
     { 


      int x = counter - 1; 
      Console.WriteLine(x); // this will write the line number not its contents 

     } 

     counter++; 
    } 

    file.Close(); 
} 
+0

你多少行会希望保持到该字后发现 –

+0

外貌就像一个家庭作业问题,其中提示是行列表已被声明但未被使用,所以你只需要弄清楚如何添加一些东西到列表中,然后引用先前的事件。 – PeterJ

+0

如果行包含寻找文件结束和退出循环,否则写入行 – 2012-12-30 06:53:55

回答

0

该代码将立即显示所有行包含搜索文本的任何行之前。

private static void Main(string[] args) 
    { 
     string cacheline = ""; 
     string line; 

     System.IO.StreamReader file = new System.IO.StreamReader("C:\\overview2.srt"); 
     List<string> lines = new List<string>(); 
     while ((line = file.ReadLine()) != null) 
     { 
      if (line.Contains("medication")) 
      { 
       lines.Add(cacheline); 
      } 
      cacheline = line; 
     } 
     file.Close(); 

     foreach (var l in lines) 
     { 
      Console.WriteLine(l);   
     } 
    } 

从您的问题中很难判断出您正在寻找所有在找到的行或仅仅一行之前的行。 (您必须处理在第一行中找到搜索文本的特殊情况)。

+0

我需要写一个所有行内容(文本)列表而不是行号。例如,如果第6行包含单词“药物”,我需要得到第5行的文本。谢谢 – hncl

+0

此代码应该完全符合这一点。上一行被缓存在每个循环中。如果在下一行找到“药物”,它可以保存到列表中。 –

+0

它运行良好,除了它只显示一行,有15行包含指定的单词“药物”。谢谢 – hncl

0

您可以创建一个Queue<string>。当你通过它时将每一行添加到它。如果它超过所需的行数,则将第一个项目出列。当您点击所需的搜索表达式时,Queue<string>包含您需要输出的所有行。

或者如果内存不是对象,则可以使用File.ReadAllLines(请参阅http://msdn.microsoft.com/en-us/library/system.io.file.readalllines.aspx)并将其索引到数组中。

0

试试这个:

int linenum = 0; 
       foreach (var line in File.ReadAllLines("Your Address")) 
       { 
        if (line.Contains("medication")) 
        { 
         Console.WriteLine(string.Format("line Number:{} Text:{}"linenum,line) 
//Add to your list or ... 
        } 
        linenum++; 
       } 
2

使用LINQ方法语法:

var lines = File.ReadLines("E:\\overview2.srt") 
     .Where(line => line.Contains("medication")) 
     .ToList(); 

和LINQ关键字语法:

​​

如果你需要一个数组,使用.ToArray()代替.ToList()

另外,如果你需要的是在线路重复一次,不ToArrayToList打扰:

var query = 
    from line in File.ReadLines("E:\\overview2.srt") 
    where line.Contains("medication") 
    select line; 
foreach (var line in query) { 
    Console.WriteLine(line); 
}