删除while((line = r.ReadLine())!= null)中的最后3行但不打开新文本文件以删除行?

时间:2012-07-03 09:03:41

标签: c#

这是我到目前为止看到的删除文本文件中最后3行的代码,但是需要确定string [] lines = File.ReadAllLines();这对我来说是必要的。

string[] lines = File.ReadAllLines(@"C:\\Users.txt");
            StringBuilder sb = new StringBuilder();
            int count = lines.Length - 3; // except last 3 lines 
            for (int s = 0; s < count; s++)
            {
                sb.AppendLine(lines[s]);

            }

代码运行良好,但我不想重新阅读该文件,因为我已经提到了上面的streamreader:

using (StreamReader r = new StreamReader(@"C:\\Users.txt"))

据我所知,在使用streamreader后我是C#的新手,如果我想修改这些行,我必须使用它:

while ((line = r.ReadLine()) != null)
{
#sample codes inside the bracket
                    line = line.Replace("|", "");
                    line = line.Replace("MY30", "");
                    line = line.Replace("E", "");
}

那么,有没有办法删除文件中的最后3行“while((line = r.ReadLine())!= null)”??

我必须一次删除行,替换行和一些其他修改,所以我不能一次又一次地打开/读取相同的文本文件来修改行。我希望我问的方式对你们来说是明白的&gt;。&lt;

Plz帮助我,我知道这个问题听起来很简单但是我已经搜索了很多方法来解决它但是失败了=(

到目前为止,我的代码是:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication11
{
public class Read
{

    static void Main(string[] args)
    {

        string tempFile = Path.GetTempFileName();
        using (StreamReader r = new StreamReader(@"C:\\Users\SAP Report.txt"))
        {
            using (StreamWriter sw = new StreamWrite (@"C:\\Users\output2.txt"))
            {
                string line;

                while ((line = r.ReadLine()) != null)
                {
                    line = line.Replace("|", "");
                    line = line.Replace("MY30", "");
                    line = line.Replace("E", "");

                    line = System.Text.RegularExpressions.Regex.Replace(line, @"\s{2,}", " ");

                    sw.WriteLine(line);
                }
     }
            }
        }
    }
}

现在我的下一个任务是删除这些代码后文件中的最后3行,我需要帮助。

谢谢。

3 个答案:

答案 0 :(得分:3)

使用 File.ReadAllLines ,您已经阅读了该文件,因此您可以处理字符串[] 中的每一行(替换和正则表达式),然后编写它们在输出中。您不必重新读取它们并将它们放在 StringBuilder

答案 1 :(得分:1)

你可以保留前三行的“滚动窗口”:

string[] previousLines = new string[3];
int index = 0;
string line;
while ((line = reader.ReadLine()) != null)
{
    if (previousLines[index] != null)
    {
        sw.WriteLine(previousLines[index]);
    }
    line = line.Replace("|", "")
               .Replace("MY30", "")
               .Replace("E", "");
    line = Regex.Replace(line, @"\s{2,}", " ");
    previousLines[index] = line;
    index = (index + 1) % previousLines.Length;
}

答案 2 :(得分:1)

您可以保留行列表并稍后加入,而不是将行直接附加到字符串构建器。这样你就可以轻松地省去最后三行。

要减少必须保留在列表中的行数,您可以定期附加列表中的一行并将其从中删除。因此,您将在阵列中保留3行的缓冲区,并且会弹出&amp;每当缓冲区包含4行时附加一行。