有条件地从文本文件中删除最后一行

时间:2010-05-21 20:43:30

标签: c# file text line

我昨天在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),我如何将其更改为仅删除文本文件的最后一行。

如果它不是那个,比如%,那么我不想删除最后一行。

有人可以修改上面的代码来为我做这个吗?

7 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

你必须在

之后进行有条件的检查
line = reader2.ReadLine();

检查EndOfStream,如果这是真的,则对该行进行条件检查(RegEx或line.Length == 5)。

答案 2 :(得分:0)

创建一个与4位或5位数字符串匹配的RegEx,并过滤掉您的行删除。 C#RegEx练习/学习在网上有很多好的网站。

答案 3 :(得分:0)

while循环结束后添加:

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

答案 4 :(得分: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语句的顺序。

答案 5 :(得分: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);最后一行。

答案 6 :(得分:-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);