【问题标题】:Conditionally strip the last line from a text file有条件地从文本文件中删除最后一行
【发布时间】:2010-05-21 20:43:30
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# file text line


    【解决方案1】:

    要保持与当前代码中相同的逻辑,您可以执行以下操作

            //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);
    

    【讨论】:

    • 我认为你需要在你的正则表达式中加上一个最后的 $,这样它就不会匹配任何以 4 位数字开头的行。
    【解决方案2】:

    你必须在之后进行条件检查

    line = reader2.ReadLine();
    

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

    【讨论】:

      【解决方案3】:

      创建一个匹配 4 位或 5 位数字字符串的正则表达式,并在此过滤您的行删除。有大量的 C# RegEx 练习/学习在线网站。

      【讨论】:

        【解决方案4】:

        while 循环结束后添加:

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

        【讨论】:

          【解决方案5】:

          我不太愿意直接为你“修改代码”,但我给你指点一下。

          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】:

            将您的 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 语句的顺序。

            【讨论】:

              【解决方案7】:
                      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);
              

              【讨论】:

              • 看来你打错了:The name 's' does not exist in the current context
              • 同样s.Length != 4 || s.Length != 5 将永远为真。
              猜你喜欢
              • 1970-01-01
              • 2019-06-08
              • 1970-01-01
              • 1970-01-01
              • 2021-11-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多