2010-05-21 60 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