2010-05-21 82 views
2

我昨天在SO上發佈了這個消息,我收到了一個很好的答案,但我需要改變它,並且我不知道該如何解決。有條件地去掉文本文件中的最後一行

這是我original question


我需要剝去從文本文件的最後一行。我知道如何在C#中打開和保存文本文件,但是如何去掉文本文件的最後一行?

該文本文件將始終是不同的大小(有些有80行,有些有20)。

如何做到這一點?


下面是代碼,有人給我做這個(工作正常)

//Delete the last line from the file. This line could be 8174, 10000, or anything. This is from SO 
string tempfile = @"C:\junk_temp.txt"; 

using (StreamReader reader2 = new StreamReader(newfilename)) 
{ 
    using (StreamWriter writer2 = new StreamWriter(tempfile)) 
    { 
     string line = reader2.ReadLine(); 

     while (!reader2.EndOfStream) 
     { 
      writer2.WriteLine(line); 
      line = reader2.ReadLine(); 
     } // by reading ahead, will not write last line to file 
    } 
} 

File.Delete(newfilename); 
File.Move(tempfile, newfilename); 
File.Delete(tempfile); 

我將如何改變這種只刪除文本文件,如果最後一行它是一個4或5位數字串(如8001或99999)。

如果除此之外的任何內容,例如%,那麼我不想刪除最後一行。

有人可以修改上面的代碼來爲我做這個嗎?

回答

3

爲了保持同樣的邏輯,你在當前的代碼,你可以做以下

 //Delete the last line from the file. This line could be 8174, 10000, or anything. This is from SO 
     string tempfile = @"C:\junk_temp.txt"; 

     using (StreamReader reader2 = new StreamReader(newfilename)) 
     { 
      using (StreamWriter writer2 = new StreamWriter(tempfile)) 
      { 
       string line = reader2.ReadLine(); 

       while (!reader2.EndOfStream) 
       { 
        writer2.WriteLine(line); 
        line = reader2.ReadLine(); 
       } // by reading ahead, will not write last line to file 

       // If the last line read does not match your condition 
       // we write it to the new file 
       if (!Regex.IsMatch(line, @"^\d{4,5}$")) 
       { 
        writer2.WriteLine(line); 
       } 
      } 
     } 

     File.Delete(newfilename); 
     File.Move(tempfile, newfilename); 
     File.Delete(tempfile); 
+0

我想你需要在你的正則表達式中有一個最後的$,所以它不匹配任何以4位開頭的行。 – 2010-05-21 20:55:51

+0

@Mike Pelley,啊謝謝!我相應地修復了它。 – 2010-05-21 20:59:43

+0

太棒了。非常感謝。 – fraXis 2010-05-21 21:18:31

0

你必須放在一個條件檢查後

line = reader2.ReadLine(); 

檢查EndOfStream的,如果這是真的,你的線路條件檢查(無論是正則表達式或line.Length == 5) 。

0

創建一個與4位或5位數字符串匹配的RegEx,並過濾您的行刪除。在C#RegEx練習/學習中有很多好網站。

0

添加了while循環結束後:

if (!Regex.IsMatch(line, @"^\d{4,5}$")) 
    writer2.WriteLine(line); 
0

更改您的while有:

while (!reader2.EndOfStream) 
{ 
    string line = reader2.ReadLine(); 
    if (reader2.EndOfStream && (CheckIfNeedToDeleteLine(line) == false)) 
    { 
     writer2.WriteLine(line); 
    } 
} 

您需要實施CheckIfNeedToDeleteLine(line)

bool CheckIfNeedToDeleteLine(string line) 
{ 
    int digit = 0; 
    return (((line.Length == 4) || (line.Length == 5)) && 
     (int.TryParse(line, out digit)))  
} 

Regex實施CheckIfNeedToDeleteLine

bool CheckIfNeedToDeleteLine(string line) 
{ 
    return Regex.IsMatch(line, @"^\d{4,5}$"); 
} 

不知道哪個更有效,但它不會真的重要,因爲它只會在最後一次迭代發生,因爲if語句的順序。

0

我不願意直接爲你「修改代碼」,但我會給你一個指針。

string line = reader2.ReadLine(); 

while (!reader2.EndOfStream) 
{ 
    writer2.WriteLine(line); 
    line = reader2.ReadLine(); 
} // by reading ahead, will not write last line to file 

權這個代碼的最後括號}後,你有文件中的變量line的最後一行。在你當前的代碼中,這條線會被扔掉。我建議你在這裏插入一個「if」語句,將最後一行與你的標準進行比較。你可以使用正則表達式來解決這個問題,例如^[0-9]{4,5}$應該是合適的。

如果符合條件,只需在最後一行再撥打writer2.WriteLine(line);

-1
 string tempfile = @"C:\junk_temp.txt"; 

     using (StreamReader reader2 = new StreamReader(newfilename)) 
     { 
      using (StreamWriter writer2 = new StreamWriter(tempfile)) 
      { 
       string line = reader2.ReadLine(); 

       while (!reader2.EndOfStream) 
       { 
        writer2.WriteLine(line); 
        line = reader2.ReadLine(); 
       } // by reading ahead, will not write last line to file 
       int result=0; 
       if (Int32.TryParse(s, out result)) 
       { 
        if (s.Length != 4 || s.Length != 5) 
         writer2.WriteLine(line); 
       } 
      } 
     } 

     File.Delete(newfilename); 
     File.Move(tempfile, newfilename); 
     File.Delete(tempfile); 
+0

看起來你有一個錯字:'名字''在當前上下文中不存在' – 2010-05-21 21:03:07

+0

也是'.Length!= 4 || s.Length!= 5'永遠是真的。 – 2010-05-21 21:06:10

相關問題