我的檔案很大,不想全部讀取,再隨機一行,想通過檔案指標隨機讀取一行?
1273517127361273521127127358612735381273538fa1273606131273636...
回複內容:
我的檔案很大,不想全部讀取,再隨機一行,想通過檔案指標隨機讀取一行?
1273517127361273521127127358612735381273538fa1273606131273636...
現在有一個10G檔案,要隨機擷取其中的一行資料。肯定不能一次把內容全部讀取!!!
因此可以按位元組隨機讀取
使用函數:
filesize 擷取此檔案的總位元組
ftell 當前檔案指標位置
fseek 定位檔案指標位置
fgets 按行讀取檔案
實現思路有了吧:
開始位置可以隨機取,即可實現隨機讀取資料。
比如總位元組100,一行10位元組,開始讀取位元組的位置隨機取0~90位元組中間的數。
為了資料的完整性,可以多讀幾行,那麼結束位置就設為:開始位置+行數*每行位元組大小
反正大概那個數就行了
因為每次讀取不可能是一行的頭,因為可以多讀幾行,然後用explode分割成一個數組,拋棄數組首尾,再隨機擷取其中的一條
下面這是按位元組分頁讀取檔案的內容,可以做個參考
public static function readFileBySize($file, $currentPage=1, $pageSize=100000) { $read = ""; $fileSize = filesize($file); $totalPage = ceil($fileSize/$pageSize); $start = filesize($file) - $currentPage*$pageSize; $stop = filesize($file) - ($currentPage-1)*$pageSize; $fp = fopen($file, 'r'); fseek($fp, $start, SEEK_SET); while(ftell($fp) < $stop){ $read .= fgets($fp); } fclose($fp); $memory = function_exists('ini_get') ? ini_get("memory_limit"):0; $returnData = array( "fileSize" => $fileSize, "pageSize" => $pageSize, "totalPage" => $totalPage, "currentPage" => $currentPage, "memory" => $memory, "data" => $read ); return $returnData; }
檔案不大可以直接用file()函數讀取一個檔案,返回一個數組,數組的每一個元素對應檔案的一行.
檔案大的話可以用檔案指標.
$file_path = 't.txt'; //檔案路徑
$s = exec('wc -l '.$file_path);//get lines
$i = 0;
$fp = fopen($file_path,'r');
while ( fgets($fp) !== false) {
$i++;if($i === 4){ // if lines = 4 echo fgets($fp);}
}