如何从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而不是调用单独的函数来将数据保存到新文件,使用临时名称重命名原始文件,重命名新文件使其与原始文件同名,并删除原始文件。”