2012-12-30 198 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); 
}