2011-09-26 152 views
0

嗨我有一個文本文件與表架構和數據時用戶檢查不需要架構,那麼我需要刪除架構並保留數據。我正在使用StreamReader來讀取文件並檢查一個條件,它應該刪除文件中的所有行,直到它滿足我的條件。 讓我們說,如果我檢查刪除文本文件中的行

using (StreamReader tsr = new StreamReader(targetFilePath)) 
     { 
      do 
      { 
       string textLine = tsr.ReadLine() + "\r\n"; 

       { 
        if (textLine.StartsWith("INSERT INTO")) 
        { 

         // It should leave these lines 
         // and no need to delete lines 
        } 

        else 
        { 
         // it should delete the lines 
        } 

       } 
      } 
      while (tsr.Peek() != -1); 
      tsr.Close(); 

請建議我如何刪除行並注意是否一個TextLine發現「INSERTINTO」它不應該從中刪除任何內容。

回答

1

您讀取文件中的只是你在做同樣的方式。但是,如果該行不包含您要查找的內容,則只需跳過它即可。最後,無論您將哪些數據留給您,都會寫入新的文本文件。

  private void button1_Click(object sender, EventArgs e) 
    { 
     StringBuilder newText = new StringBuilder(); 
     using (StreamReader tsr = new StreamReader(targetFilePath)) 
     { 
      do 
      { 
       string textLine = tsr.ReadLine() + "\r\n"; 

       { 
        if (textLine.StartsWith("INSERT INTO")) 
        { 

         newText.Append(textLine + Environment.NewLine); 
        } 

       } 
      } 
      while (tsr.Peek() != -1); 
      tsr.Close(); 
     } 

     System.IO.TextWriter w = new System.IO.StreamWriter(@"C:\newFile.txt"); 
     w.Write(newText.ToString()); 
     w.Flush(); 
     w.Close(); 
    } 
+0

您應該使用StringBuilder而不是連接字符串....取決於行數,它可以更高效 –

+0

謝謝Steve。我的答案已更新。 – 2011-09-26 13:39:55

+0

@Evan:謝謝埃文的回答 – 62071072SP

6

使用第二個文件放置只需要的行,並在過程結束時刪除原始文件並將新文件重命名爲目標文件。

using (StreamReader tsr = new StreamReader(targetFilePath)) 
{ 
    using (StreamWriter tsw = File.CreateText(targetFilePath+"_temp")) 
    { 
     string currentLine; 
     while((currentLine = tsr.ReadLine()) != null) 
     { 
      if(currentLine.StartsWith("A long time ago, in a far far away galaxy ...")) 
      { 
        tsw.WriteLine(currentLine); 
      } 
     } 
    } 
} 
File.Delete(targetFilePath); 
File.Move(targetFilePath+"_temp",targetFilePath); 
+1

此代碼可以通過重命名原始文件而不是刪除它來改進,以防發生異常。 –

4

你可以使用Linq:

File.WriteAllLines(targetFilePath, File.ReadAllLines(targetFilePath).Where(x => x.StartsWith("INSERT INTO"))); 
+0

你的方法很好,但在極端情況下,這一行代碼的內存佔用至少與整個文件大小一樣高(charset可以提高此值)。幸運的是,有一個100GB的文本文件是不常見的;) –

+0

@SteveB:這是正確的 - 這是您在這種情況下不使用臨時文件所支付的代價,所有內容都必須加載到內存中。或者可以使用'FileReadLines()'並寫入臨時文件,然後複製它。 – BrokenGlass

+0

即使是5MB的文件也不常見......與今天的電腦。這不會是一個大問題。它甚至可以作爲過早優化來逐行工作;) –