2013-06-24 138 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用於考慮客戶報告之前的關鍵錯誤* ;-) –

相關問題