我有一個10MB的文本文件。
線條的長度可能會有所不同。從大文本文件中讀取單行
哪一種方法(快速和內存友好)從這個文件中只讀取一個特定的行?例如get_me_the_line($nr, $file_resource)
我有一個10MB的文本文件。
線條的長度可能會有所不同。從大文本文件中讀取單行
哪一種方法(快速和內存友好)從這個文件中只讀取一個特定的行?例如get_me_the_line($nr, $file_resource)
我不知道如果線條長度不一樣,只是跳到這條線上。但是,當你不用任何東西時,你可以很快地遍歷行,並返回感興趣的行。
function ReadLineNumber($file, $number)
{
$handle = fopen($file, "r");
$i = 0;
while (fgets($handle) && $i < $number - 1)
$i++;
return fgets($handle);
}
編輯
我加- 1
的循環,因爲這提前讀取一行。因此$number
是一個零指數線參考。如果您希望第1行代表文件中的第一行,請更改爲- 2
。
由於線條長度不同,所以您必須查看每個字符,因爲它可能表示線條的末端。最快的是將文件加載到大小與文件系統的塊大小相同的塊中,並計算換行符,直到您位於所需的行上。 更好的方法是創建一個索引文件,該文件存儲有關包含這些行的文件的信息。使用數據庫也可能是一個更好的主意。
如果該文件是真正的大(幾個GB或更多),您的應用程序運行在* nix你可能不想嘗試讓PHP程序的文件,而使用一些現有的Unix工具,這種線的優化處理。一旦這樣的工具是sed
,並且從巨大文件中打印特定行的示例可以找到here。
應該很簡單,在system_exec()
調用或類似的函數中編寫您正在查找的函數。
剛剛看到OP提到的文件只有10MB。錯過了。對於幾百MB以下的任何內容,此解決方案可能不值得攜帶。 –
是的,這是最好的選擇,但我需要一個PHP解決方案,因爲我沒有root訪問權限,不能「執行」任何操作。 – Sfisioza