2015-11-20 15 views
-2

我讀了巨大的文本文件,如below.What現在要低於10日線得到的是,如果我達到一個特定的詞說test:在這裏,我將數據庫從推值該行並從其中一個價值在於通過連接值從10成功line.So我想通過使用File. Readalllines或任何其他mechanism.How我會達到現在我it.As得到10後續行並將其存儲到內存中將整個文本文件加載到File.Readalllines,這導致應用程序非常慢。如何從文本文件在C#線

using (FileStream fs = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
using (BufferedStream bs = new BufferedStream(fs)) 
using (StreamReader sr = new StreamReader(bs)) 
{ 
    string s = String.Empty; 
    while ((s = sr.ReadLine()) != null) 
    { 
     if (s.Contains("test:")) 
     { 
      // 
     } 
    } 
} 

編輯 我讀書花錢的答案,在這裏一個扭曲假設我有10000行始於test:和每一行都有ID,我基於插入行一個ID,如果存儲在像ID == ID字典,那麼我必須儲存成功的10行,而不是前10行總是,所以如何做?

編輯 @spender我做到了像SkipWhile(line => (!line.Contains("ADD GTRX:") && !line.Contains(dict.CellId.ToString()))).Take(10);但沒有運氣可言

編輯 @spender最後我做到了我必須移動支架使完整的代碼,我所做的,如下圖所示,我刪除空行也

var linesOfInterest = File.ReadLines(filename) 
                   .SkipWhile(line => !line.Contains("test:")).SkipWhile(line => !line.Contains(dictId.ToString())).Take(10); 
            var output = string.Join(Environment.NewLine, linesOfInterest).Trim().Split(';').Where(arg => !string.IsNullOrWhiteSpace(arg)).ToArray(); 

你是偉大的,有一個愉快的一天

+2

for(int i = 0; i <10; i ++)liststring.Add(sr.ReadLine()); ? – owairc

+0

@ user5507337我編輯了我的問題 – peter

+0

嗨,我的想法是一樣的,最新的問題是什麼? – owairc

回答

5

File.ReadLines是你的朋友在這裏。它給你一個IEnumerable<string>,懶惰地從文本文件中回傳行(即文件從未完全加載到內存中)。從那裏你可以很好地LINQ它。

var linesOfInterest = File.ReadLines(filePath) 
          .SkipWhile(line => !line.Contains(searchTerm)) 
          .Take(10); 
var output = string.Join(Environment.NewLine, linesOfInterest); 
+0

明智的性能和邏輯明智地讓我測試 – peter

+0

這正是你想要的。它要測試什麼? –

+0

不錯,但是如果文件是龐大的,彼得說內存在角落裏。剛剛看過編輯,我讀了File.ReadAllLines :) – owairc