2009-04-27 53 views
1

我剛剛接觸C#。 我需要打開一些目錄下的代碼文件,並獲得包含一些匹配字符串的特定行。 它是一個簡單的問題,我可以使用流讀取器逐個打開文件,然後逐行解析它們。 我想知道是否有更有效的方法來做同樣的事情。就像我的印象一樣,Stream閱讀器和逐行讀取操作會很繁瑣。C#讀取文件內容並查找字符串

回答

0

如果您需要檢查文件的全部內容,那麼您將需要閱讀每一行。 ReadLine()是一種很好的方法。

,您可以一次讀取整個文件的內容,使用StreamReader.ReadToEnd()

1

File.ReadAllLines()會給你包含該文件中的每一行的數組。儘管如果你能夠在文件的中途停止閱讀,這可能會有更多的工作。如果沒有,它可能會節省你一些時間在IO(少個人IO調用,這只是一個猜測)。

如果你真的擔心,可以使用分析器或編寫一個基準。否則,使用最簡單的方法閱讀。

0

ReadToEnd()方法在LoC(代碼行)方面的確效率很高,但如果您關心性能,您可能需要小心,因爲它基本上會將整個文件內容加載到內存(串)。如果文件大小相當大,您肯定會對性能產生影響。

5

關於如何獲取文件的行,已經有一些好帖子,所以我想我會補充一點效率。有幾個人提到了File.ReadAllLines()方法。從效率的角度來看,這種方法存在問題,因爲它會一次將整個文件讀入內存。另外它使用一個數組作爲需要連續內存的存儲。如果文件足夠大,則會導致問題。

讀取文件的更有效方法是反覆使用StreamReader.ReadLine方法。它將一次返回一行,並且只需要保留內存中您關心的行。將它變成延遲評估迭代器也相對容易。

public static IEnumerable<string> ReadLinesEnumerable(string path) { 
    using (var reader = new StreamReader(path)) { 
    var line = reader.ReadLine(); 
    while (line != null) { 
     yield return line; 
     line = reader.ReadLine(); 
    } 
    } 
} 

就LINQ而言。您可以使用LINQ來同時匹配ReadAllLines和ReadLinesEnumerable方法,因爲它們都返回可枚舉的數據類型。例如

var query = from line in ReadLinesEnumerable(@"c:\some\path\file.txt") 
      where Regex.IsMatch(line, @"^(\d)+.*$") 
      select line; 
+0

這是一個很好的做法。 – 2009-04-27 05:41:34

相關問題