2013-06-24 103 views
6

我发现这个代码在stackoverflow从文本文件中删除第一行和最后一行。如何从文本文件中删除第一行和最后一行c#?

但我没有得到如何将此代码合并为一个,以便它将从单个文件中删除1st和 最后一行?

我试过的是使用streamreader读取文件,然后跳过第一行和最后一行然后 streamwriter写入新文件,但无法获得正确的结构。

删除第一行。

var lines = System.IO.File.ReadAllLines("test.txt"); 
System.IO.File.WriteAllLines("test.txt", lines.Skip(1).ToArray()); 

删除最后一行。

var lines = System.IO.File.ReadAllLines("..."); 
System.IO.File.WriteAllLines("...", lines.Take(lines.Length - 1).ToArray()); 

回答

20

您可以链SkipTake方法。请记得在Take方法中减去适当的行数。您在开始时跳过的越多,剩下的线越少。

var filename = "test.txt"; 
var lines = System.IO.File.ReadAllLines(filename); 
System.IO.File.WriteAllLines(
    filename, 
    lines.Skip(1).Take(lines.Length - 2) 
); 
1

这是一个使用ArraySegment<string>而不是一种不同的方法:

var lines = File.ReadAllLines("test.txt"); 
File.WriteAllLines("test.txt", new ArraySegment<string>(lines, 1, lines.Length-2)); 
4

虽然可能不是在这种情况下,一个主要的问题,现有的答案都依赖于读取文件的全部内容复制到内存第一。对于小文件,这可能很好,但如果你正在处理非常大的文件,这可能会令人望而却步。

它相当琐碎创建SkipLast相当于现有Skip LINQ的方法:

public static class SkipLastExtension 
{ 
    public static IEnumerable<T> SkipLast<T>(this IEnumerable<T> source, int count) 
    { 
     var queue = new Queue<T>(); 
     foreach (var item in source) 
     { 
      queue.Enqueue(item); 
      if (queue.Count > count) 
      { 
       yield return queue.Dequeue(); 
      } 
     } 
    } 
} 

如果我们还定义了一个方法,使我们能够列举了文件中的每一行不预缓冲整文件(按:https://stackoverflow.com/a/1271236/381588):

static IEnumerable<string> ReadFrom(string filename) 
{ 
    using (var reader = File.OpenText(filename)) 
    { 
     string line; 
     while ((line = reader.ReadLine()) != null) 
     { 
      yield return line; 
     } 
    } 
} 

然后我们可以使用下面的一行写一个新的文件,其中包含从原始文件中的所有行,除了第一个和最后如下:

File.WriteAllLines("output.txt", ReadFrom("input.txt").Skip(1).SkipLast(1)); 

这无疑是(相当)高于已经张贴在这里其他的答案更多的代码,而应该基本上任何大小的文件工作,(还有一个潜在的有用SkipLast扩展方法提供代码)。

+2

+1用于考虑客户报告之前的关键错误* ;-) –

相关问题