2014-02-23 62 views
10
public void get10FirstLines() 
{ 
    StreamReader sr = new StreamReader(path); 
    String lines = ""; 
    lines = sr.readLine(); 
} 

如何獲取字符串中文件的前10行?將文件的前10行提取爲字符串

+2

你的問題是不是非常清楚 - 你的方法被調用'skip10Lines'這是不一樣的* *獲得第10行到一個字符串。目前還不清楚你是否真的想要單行或列表中的行。 –

+0

如果這是來自ypur真實代碼:'path'應該是一個參數。 –

回答

21

而不是直接使用StreamReader,使用File.ReadLines它返回一個IEnumerable<string>。然後,您可以使用LINQ:

var first10Lines = File.ReadLines(path).Take(10).ToList(); 

使用File.ReadLines代替File.ReadAllLines的好處是不是讀取整個文件,這只有讀取你感興趣的線路。另一方面,它只能在.NET 4+中使用。如果你需要.NET 3.5的話,使用迭代器塊很容易實現。

ToList()的調用是強制對查詢進行評估(即實際讀取數據),使其被讀取正好一次。如果沒有ToList電話,如果你試圖遍歷first10Lines不止一次,那麼它會讀取文件多於一次(假設它在所有工作,我似乎記得,File.ReadLines沒有在這方面實施的非常乾淨)。

如果你想第一個10線爲字符串(例如,使用「\ r \ n」它們分開),那麼你可以使用string.Join

var first10Lines = string.Join("\r\n", File.ReadLines(path).Take(10)); 

很明顯,你可以通過改變改變分離器通話中的第一個參數。

+1

非常好的解決方案,我會建議把它放在抽象的可測性背後。 – Gent

6
var lines = File.ReadAllLines(path).Take(10); 
+0

如果用戶讀取2 GB(9999行)文件並且只需要前10行,它是否只訪問前10行? –

+0

@huseyintugrulbuyukisik:不,它會讀取所有內容 - 因此我的答案。 –

+2

'文件。ReadLines()'可能是一個非常大的優化。 –

2
StringBuilder myString = new StringBuilder(); 

TextReader sr = new StreamReader(path); 

for (int i=0; i < 10; i++) 
{ 
myString.Append(sr.ReadLine()) 
} 
2
String[] lines = new String[10]; 
for (int i = 0; i < 10; i++) 
    lines[i] = sr.readLine(); 

循環十次並將結果放入新數組中。

4

您可以嘗試使用File.ReadLines。試試這個: -

var lines = File.ReadLines(path).Take(10); 

你的情況,試試這個,只要你想第一個10行作爲一個單一的字符串,所以你可以嘗試使用string.Join()這樣的:

var myStr= string.Join("", File.ReadLines(path).Take(10)); 
0
public void skip10Lines() 
{ 
    StringBuilder lines=new StringBuilder(); 
    using(StreamReader sr = new StreamReader(path)) 
    { 
    String line = ""; 
    int count=0; 

     while((line= sr.ReadLine())!=null) 
     { 
     if(count==10) 
      break; 
     lines.Append(line+Environment.NewLine); 
     count++; 
     } 
    } 

string myFileData=lines.ToString(); 
} 

OR

public void skip10Lines() 
{ 
    int count=0; 
    List<String> lines=new List<String>(); 
    foreach(var line in File.ReadLines(path)) 
    { 
     if(count==10) 
      break; 
     lines.Add(line); 
     count++; 
    } 
} 
+1

這不會編譯('ReadLine',而不是'readLine'),並且它不會在最後關閉閱讀器。 –

0

在Groovy中,一種基於JVM的語言,一種方法是:

def buf = new StringBuilder() 

Iterator iter = new File(path).withReader{ 
    for(int cnt = 0;cnt < 9;cnt++){  
     buf << it.readLine() 
    } 
} 

println buf 

因爲閉包沒有'break',所以循環嵌套在閉包中,因此資源處理由Groovy運行時管理。

相關問題