每天一個學習一個新的php函數(2) fgetcsv()/fgets()
檔案讀寫是經常進行的一個動作,讀取檔案的函數真是千千萬萬個,複雜的有,簡單的也有。最常用方便的有file_get_contents(),file_put_conents(),不需要進行開啟檔案,關閉檔案的操作。
但是對超大檔案進行讀取時,file_get_contents()會把內容都讀取進記憶體,造成記憶體溢出,最好是迴圈按行讀取。fgetcsv()用來讀取一行csv檔案,fgets()用來讀取一樣普通檔案。
fgetcsv()
csv,是一種特殊格式的表單文字檔,用‘,’分隔每個欄位,用’\n’分隔每行。可以用fgetcsv讀取每個欄位,或者用fgets讀取每行,然後用explode(‘,’,$data)分隔每行的資料。
fgetcsv — 從檔案指標中讀入一行並解析 CSV 欄位
array fgetcsv ( resource $handle [, int $length = 0 [, string $delimiter = ‘,’ [, string $enclosure = ‘”’ [, string $escape = ‘\’ ]]]] )
參數
handle
接受一個由 fopen()、 popen() 或 fsockopen() 產生的有效檔案指標。
length
必須大於 CVS 檔案內最長的一行。在 PHP 5 中該參數是可選的。如果忽略(在 PHP 5.0.4 以後的版本中設為 0)該參數的話,那麼長度就沒有限制,不過可能會影響執行效率。
delimiter
設定欄位分界符(只允許一個字元)。
enclosure
設定欄位環繞符(只允許一個字元)。
escape
設定逸出字元(只允許一個字元),預設是一個反斜線。
注意:如果csv欄位的字元長度大於設定的length,那麼函數每次只會讀取length長度的字元,並返回索引為0的數組,當遇到分隔字元’,’時,分隔字元後的字串會被屏蔽。
example
\n"; } fclose($handle);}?>
以上會輸出
user11
11
r222
user33
33
r4444
fgets()
fgets — 從檔案指標中讀取一行
string fgets ( resource $handle [, int $length ] )
參數
handle
檔案指標必須是有效,必須指向由 fopen() 或 fsockopen() 成功開啟的檔案(並還未由 fclose() 關閉)。
length
從 handle 指向的檔案中讀取一行並返回長度最多為 length - 1 位元組的字串。碰到分行符號(包括在傳回值中)、EOF 或者已經讀取了 length - 1 位元組後停止(看先碰到那一種情況)。如果沒有指定 length,則預設為 1K,或者說 1024 位元組。
Note:
從 PHP 4.3 開始,忽略掉 length 則行的長度被假定為 1024,將繼續從流中讀取資料直到行結束。如果檔案中的大多數行都大於 8KB,則在指令碼中指定最大行的長度在利用資源上更為有效。
傳回值
從指標 handle 指向的檔案中讀取了 length - 1 位元組後返回字串。 如果檔案指標中沒有更多的資料了則返回 FALSE。
錯誤發生時返回 FALSE。