如何从c#.net中的文本文件中删除空行

时间:2015-04-27 04:52:59

标签: c# asp.net

我想删除我文件中的空白行,我想使用下面的代码。

 private void ReadFile(string Address)
{

    var tempFileName = Path.GetTempFileName();
    try
    {
        //using (var streamReader = new StreamReader(Server.MapPath("~/Images/") + FileName))
        using (var streamReader = new StreamReader(Address))
        using (var streamWriter = new StreamWriter(tempFileName))
        {
            string line;
            while ((line = streamReader.ReadLine()) != null)
            {
                if (!string.IsNullOrWhiteSpace(line))
                    streamWriter.WriteLine(line);
            }
        }
        File.Copy(tempFileName, Address, true);
    }
    finally
    {
        File.Delete(tempFileName);
    }
    Response.Write("Completed");
}

但问题是我的文件太大(8条紫胶线)因此需要花费大量时间。那么有没有其他方法可以更快地完成它?

2 个答案:

答案 0 :(得分:3)

我不是做一个ReadLine(),而是用StreamReader.ReadToEnd()把整个文件加载到内存中,然后做一行。换行(“\ n \ n”,“\ n”)然后做streamWrite.Write(行)到文件。这样就没有太多的颠簸,无论是内存还是磁盘,都在继续。

答案 1 :(得分:1)

最佳解决方案可能完全取决于磁盘类型 - 固态硬盘和旋转防锈表现不同。您当前的方法优于史蒂夫的答案,即当数据仍然从磁盘上传出时能够进行处理(例如将文本数据编码为二进制)。 (通过缓冲和后台IO,这里存在很多潜在的异步性。)绝对值得尝试这两种方法。 (显然你的方法也使用更少的内存。)

但是,您的代码的一个方面肯定不是最理想的:创建结果的副本。你不需要这样做。您可以使用文件移动,这样可以提高效率,假设它们全部在同一个驱动器中。为确保您不会丢失数据,您可以执行两项操作并删除:

  • 将旧文件移至备用文件名
  • 将新文件移至旧文件名
  • 删除备份文件名

看来这就是File.Replace为您所做的事情,这使得它变得相当简单,并且还保留了原始元数据。

如果在第一次移动后出现问题,您将离开,而不是"正确的"来自旧版或新版的文件,但您可以检测到该文件并使用备份文件名进行下次读取。

当然,如果这是作为Web请求的一部分发生的,您可能希望在后台任务中执行所有处理 - 处理800,000行文本可能需要比您真正想要Web请求更长的时间采取...