需求與考量
需要用php讀取txt檔案,
但統計性資料(總數、總額…)都寫在最後,
需要取得平均且寫入DB中,
因為mysql 語法內無法直接採用UPDATE 數量 * 定值的形式,
(即先INSERT 再採UPDATE 各欄位,但無法一個語法UPDATE全部。)
且考量到檔案可能很大,不想要做二次遍歷。
條件
txt檔案前面為詳細各細項資料,
以\n, \r 作為斷行標誌、
\t 或 “,” (其中之一)作為資料格標誌。
以下以\t作為資料格標誌示範。
事前準備
末幾行的格式固定、需要事先指定取得的行數。
function
我們先上code
1 | function fgets_r($fp, $line_number = 1) |
使用function
1 | $fp = fopen(<yourfile_path>, 'rb'); |
使用前需要先讀入你的檔案,並採用mode r,
$line 將會是你所指定的倒數行數,
注意,範例code為取得倒數第5行。
且可以接著使用fgets 順著往下取資料。
例如
1 | $line = fgets_r($fp, 5); |
function 說明
fopen 為讀取檔案,獲取檔案資源使用,此功能為讀取,故採用rb。
fgets 本身可以一次讀取一行,
在一般情況下,可以使用
1 | while(!feof($fp)) |
取完全部的資料。
fseek 第二個參數為讀取的指標位置,
第三個參數分成三個模式
- SEEK_SET: 偏移量直接設定
- SEEK_CUR: 現在位置 + 偏移量
- SEEK_END: 文件末尾位置 + 偏移量(nagative number)
從尾到頭遍歷
目前我並沒有實作出這個功能,
但我認為是需要改用do… while 方式進行,
由於第一次的fseek 需要指定為-1, 模式使用SEEK_END
fseek($fp, -1, SEEK_END);
後面遍歷的fseek需要改用指標位置 + SEEK_CUR來操作。