2011-08-08 31 views
2

我有一個10MB的文本文件。
線條的長度可能會有所不同。從大文本文件中讀取單行

哪一種方法(快速和內存友好)從這個文件中只讀取一個特定的行?例如get_me_the_line($nr, $file_resource)

回答

6

我不知道如果線條長度不一樣,只是跳到這條線上。但是,當你不用任何東西時,你可以很快地遍歷行,並返回感興趣的行。

function ReadLineNumber($file, $number) 
{ 
    $handle = fopen($file, "r"); 
    $i = 0; 
    while (fgets($handle) && $i < $number - 1) 
     $i++; 
    return fgets($handle); 
} 

編輯

我加- 1的循環,因爲這提前讀取一行。因此$number是一個零指數線參考。如果您希望第1行代表文件中的第一行,請更改爲- 2

2

由於線條長度不同,所以您必須查看每個字符,因爲它可能表示線條的末端。最快的是將文件加載到大小與文件系統的塊大小相同的塊中,並計算換行符,直到您位於所需的行上。 更好的方法是創建一個索引文件,該文件存儲有關包含這些行的文件的信息。使用數據庫也可能是一個更好的主意。

1

如果該文件是真正的大(幾個GB或更多),您的應用程序運行在* nix你可能想嘗試讓PHP程序的文件,而使用一些現有的Unix工具,這種線的優化處理。一旦這樣的工具是sed,並且從巨大文件中打印特定行的示例可以找到here

應該很簡單,在system_exec()調用或類似的函數中編寫您正在查找的函數。

+0

剛剛看到OP提到的文件只有10MB。錯過了。對於幾百MB以下的任何內容,此解決方案可能不值得攜帶。 –

+0

是的,這是最好的選擇,但我需要一個PHP解決方案,因爲我沒有root訪問權限,不能「執行」任何操作。 – Sfisioza