2009-10-03 137 views
4

對於我正在做的項目,我必須做的一件事是刪除明文文件的第一行X行。我說的是X,因爲我需要多次執行此例程,每次刪除的行都會不同,但它們總是從頭開始,刪除第一行,然後將結果輸出到同一個文件。如何刪除文本文件的第一個「X」行?

我想到做這樣的事情,這是我從其他的教程和例子,我讀拼湊:

String line = null; 

String tempFile = Path.GetTempFileName(); 
String filePath = openFileDialog.FileName; 

int line_number = 0; 
int lines_to_delete = 25; 

using (StreamReader reader = new StreamReader(originalFile)) { 
    using (StreamWriter writer = new StreamWriter(tempFile)) { 
     while ((line = reader.ReadLine()) != null) { 
      line_number++; 

      if (line_number <= lines_to_delete) 
       continue; 

      writer.WriteLine(line); 
     } 
    } 
} 

if (File.Exists(tempFile)) { 
    File.Delete(originalFile); 
    File.Move(tempFile, originalFile); 
} 

但我不知道這是否會因爲像行號的小東東工作從第0行開始或者什麼都不...也不知道在效率和形式方面它是否是好代碼。

非常感謝。

回答

6

沒關係,看起來不會有你害怕的錯誤問題。然而,更精簡的方法將由兩個獨立的循環提供 - 一個只計算來自輸入文件的第一個X行(並且別無其他),另一個只是將其他行從輸入複製到輸出。即的,而不是單一while循環,有...:

while ((line = reader.ReadLine()) != null) { 
     line_number++; 

     if (line_number > lines_to_delete) 
      break; 
    } 

    while ((line = reader.ReadLine()) != null) { 
     writer.WriteLine(line); 
    } 
+0

這工作,因爲當我再次做reader.ReadLine(),將恢復從閱讀離開的地方,對不對? 如果我想讓另一個閱讀器稱爲「閱讀器」(因爲這將在一個更大的循環中重複這個過程多次),我只需要關閉「閱讀器」,然後當我做出另一個時,它會開始從文件開始回來,對嗎? – ankushg 2009-10-03 23:37:40

+0

@Unk,這是對這個評論中的兩個問題。 – 2009-10-04 01:12:46

+0

非常感謝! – ankushg 2009-10-04 01:23:12

0

你可以文件讀入到線的陣列,忽略了最初的幾個要素,剩下的回信。

這種方法的缺點是它會佔用內存中文件的大小。你的方法(雖然相當不可讀,沒有進攻)沒有這個記憶問題。雖然文件不是太大,但不應該擔心內存使用的問題。

例子:

string[] lines = System.IO.File.ReadAllLines("YourFile.txt").Skip(10).ToArray(); 
System.IO.File.WriteAllLines("OutFile.txt", lines); 
+0

是的,主要的問題是該文件是非常大的,程序運行的計算機不完全是頂尖的。我已經在使用一堆數組來處理數據,所以這就是爲什麼我使用我的方法去做的原因;閱讀並當場寫作。 感謝您的幫助,反正。 – ankushg 2009-10-03 23:29:52

+0

糟糕,我的不好,忘了ToArray() – 2009-10-03 23:33:47

8

我喜歡短...

File.WriteAllLines(
    fileName, 
    File.ReadAllLines(fileName).Skip(numberLinesToSkip).ToArray()); 
+0

乾淨的解決方案。由於它將整個文件讀入內存,所以如果源文件太大,會引起問題。 – LukeH 2009-10-03 23:36:46

+0

是啊,這是真正的清潔,但正如我在查理的文章中提到,該文件是非常大,這個應用程序將不是一個強大的機器上運行... 謝謝您的好意;我不知道你使用過的所有這些方法,並且我學到了一些新的東西! – ankushg 2009-10-03 23:39:17

2

我喜歡你的方法,我認爲沒有錯。如果你確定他們是小文件,那麼其他建議可能會少一些代碼,如果這對你很重要。

A的你已經有稍微少詳細的版本:

using (StreamReader reader = new StreamReader(originalFile)) 
using (StreamWriter writer = new StreamWriter(tempFile)) 
{ 
    while(lines_to_delete-- > 0) 
     reader.ReadLine(); 
    while ((line = reader.ReadLine()) != null) 
     writer.WriteLine(line); 
} 
+0

感謝您的貢獻! – ankushg 2009-10-04 01:27:43

相關問題