2014-01-23 29 views
0

我有我需要read.Currently我讀文本文件,這樣一個巨大的文本文件閱讀後的文本文件..如何在C#中指定的行

string[] lines = File.ReadAllLines(FileToCopy); 

但這裏所有的線都得到幸福存儲在行數組中,之後根據條件正在以編程方式處理,這是不高效的方式,因爲它會先將不相關的行(行)也讀入文本文件中,並以同樣的方式處理。 所以我的問題是我可以把行號從文本文件中讀取..假設上次讀取10001行,下一次它應該從10002開始.. 如何實現它?

回答

3

忽略這些線條,它們是無用的 - 如果每條線條的長度不一樣,那麼您將不得不逐一閱讀它們,這是一個巨大的浪費。

而是使用文件流的位置。這樣,您可以在第二次嘗試時跳到那裏,不需要再次讀取數據。之後,您只需在循環中使用ReadLine,直到完成,並標記新的結束位置。

請,不要使用ReadLines().Skip()。如果你有一個10 GB的文件,它將讀取所有的10 GB,創建適當的字符串,扔掉它們,最後讀取你想讀取的100個字節。這只是瘋狂:)當然,它比使用File.ReadAllLines更好,但只是因爲它不需要一次將整個文件保存在內存中。除此之外,你還在讀文件的每一個字節(你必須找出行結束的地方)。的方法的

示例代碼從最後已知位置讀:

string[] ReadAllLinesFromBookmark(string fileName, ref long lastPosition) 
{ 
    using (var fs = File.OpenRead(fileName)) 
    { 
     fs.Position = lastPosition; 

     using (var sr = new StreamReader(fs)) 
     { 
      string line = null; 

      List<string> lines = new List<string>(); 

      while ((line = sr.ReadLine()) != null) 
      { 
       lines.Add(line); 
      } 

      lastPosition = fs.Position; 

      return lines.ToArray(); 
     } 
    } 
} 
11

那麼你不必所有這些行 - 但你一定要他們。除非行的長度是固定的(以字節爲單位,而不是字符),否則您希望如何跳至文件的特定部分?

只存儲要在內存中的線,雖然,使用:

List<string> lines = File.ReadLines(FileToCopy).Skip(linesToSkip).ToList(); 

注意File.ReadLines() .NET 4的引入,並隨需隨迭代器讀取線,而不是整個文件讀進入記憶。

如果你只想處理若干行的,你可以使用Take還有:

List<string> lines = File.ReadLines(FileToCopy) 
         .Skip(linesToSkip) 
         .Take(linesToRead) 
         .ToList(); 

因此,例如,linesToSkip=10000linesToRead=1000會給你行將從10001-11000。

0

使用Filestream.Position方法獲取該文件的位置,然後設置位置。

1

那麼你有行號,數組索引的形式。記下先前讀取的行數組索引,然後開始從下一個數組索引讀取數據。

相關問題