Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从c#.net中的文本文件中删除空行_C#_Asp.net - Fatal编程技术网

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

如何从c#.net中的文本文件中删除空行,c#,asp.net,C#,Asp.net,我想从我的文件中删除空行,因为我正在使用下面的代码 private void ReadFile(string Address) { var tempFileName = Path.GetTempFileName(); try { //using (var streamReader = new StreamReader(Server.MapPath("~/Images/") + FileName)) using (var streamRe

我想从我的文件中删除空行,因为我正在使用下面的代码

 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行lac),所以需要花费很多时间。那么有没有其他更快的方法呢?

我会使用StreamReader.ReadToEnd()将整个文件加载到内存中,然后执行line.Replace(“\n\n”,“\n”),然后对文件执行streamWrite.Write(line)操作,而不是执行ReadLine()。这样就不会有太多的震荡,无论是内存还是磁盘。

我将使用StreamReader.ReadToEnd()将整个文件加载到内存中,然后执行line.Replace(“\n\n”,“\n”),然后对文件执行streamWrite.Write(line)。这样就不会有太多的震荡,无论是内存还是磁盘。

最好的解决方案可能取决于磁盘类型-SSD和旋转锈的行为不同。与Steve的答案相比,您当前的方法有一个优势,即能够在数据仍从磁盘中流出时进行处理(例如将文本数据编码回二进制)。(对于缓冲和后台IO,这里有很多潜在的异步。)这两种方法都值得尝试。(显然,您的方法使用的内存也较少。)

然而,您的代码有一个方面是绝对次优的:创建结果的副本。你不需要那样做。如果文件移动都在同一个驱动器中,则可以使用更高效的文件移动。为确保不丢失数据,您可以执行两次移动和一次删除:

  • 将旧文件移动到备份文件名
  • 将新文件移到旧文件名
  • 删除备份文件名
看起来这就是您需要做的,这使它变得相当简单,并且还保留了原始元数据

如果在第一次移动后出现问题,您将没有来自旧文件或新文件的“正确”文件,但您可以检测到这一点,并使用备份文件名下次读取


当然,如果这是web请求的一部分,您可能希望在后台任务中完成所有处理-处理800000行文本可能比您真正希望web请求花费的时间更长…

最佳解决方案可能取决于磁盘类型-SSD和磁盘的行为不同。与Steve的答案相比,您当前的方法有一个优势,即能够在数据仍从磁盘中流出时进行处理(例如将文本数据编码回二进制)。(对于缓冲和后台IO,这里有很多潜在的异步。)这两种方法都值得尝试。(显然,您的方法使用的内存也较少。)

然而,您的代码有一个方面是绝对次优的:创建结果的副本。你不需要那样做。如果文件移动都在同一个驱动器中,则可以使用更高效的文件移动。为确保不丢失数据,您可以执行两次移动和一次删除:

  • 将旧文件移动到备份文件名
  • 将新文件移到旧文件名
  • 删除备份文件名
看起来这就是您需要做的,这使它变得相当简单,并且还保留了原始元数据

如果在第一次移动后出现问题,您将没有来自旧文件或新文件的“正确”文件,但您可以检测到这一点,并使用备份文件名下次读取


当然,如果这是web请求的一部分,您可能希望在后台任务中完成所有处理-处理800000行文本可能比您真正希望web请求记录的时间长…

,您可能需要多次替换才能捕捉到一行中有两个以上的换行符。注意,您可能需要多次替换才能捕捉到一行中有两个以上的换行符。如果我删除了备份文件,我下次如何使用它来读取???@Navy:您不需要-如果它已经到了第三步,您只需读取已修复的文件即可。只有在“真实”文件就位后,才可以删除备份文件。我认为可以通过调用来执行前两个步骤。我认为这个用例就是这个函数的用途。@Brian:太好了,谢谢-我以前没见过!这不仅仅是一种简化
File.Replace
是一个包装器,它保持旧文件的元数据完好无损(创建时间、安全属性等)。这使得它非常适合“编辑”文件。MSDN明确指出op的用例:“应用程序可以调用ReplaceFile而不是调用单独的函数来将数据保存到新文件,使用临时名称重命名原始文件,重命名新文件使其与原始文件同名,并删除原始文件。”如果我删除了备份文件,下次我如何使用它来读取???@Navy:你不需要-如果它已经到了第三步,你可以直接读取修复后的文件。只有在“真实”文件就位后,才可以删除备份文件。我认为可以通过调用来执行前两个步骤。我认为这个用例就是这个函数的用途。@Brian:太好了,谢谢-我以前没见过!这不仅仅是一种简化
File.Replace
是一个包装器,它保持旧文件的元数据完好无损(创建时间、安全属性等)。这使得它非常适合“编辑”文件。MSDN明确指出op的用例:“应用程序可以调用ReplaceFile而不是调用单独的函数来将数据保存到新文件,使用临时名称重命名原始文件,重命名新文件使其与原始文件同名,并删除原始文件。”