| 問題說明 | |
| 通常我們提供給使用者的資料輸入介面,一次只能輸入一筆資料;若是使用者手頭上持有大量已數位化的資料時,他們一定會希望能一次「塞」進我們的資料庫中,而不是一筆一筆地鍵入。 | |
| CSV(Comma Separated Value)是利用逗號做為分隔各儲存格資料的標記。在一個 CSV 檔裡頭,每筆資料(record)以一行表示,而每個欄位值之間,則用逗號隔開來,就像這個樣子: | |
| 91001,1,張三,850506,7235300 91002,2,李四,850409,7235506 91003,3,王五,841212,7235987 | |
| 大多數的試算表和資料庫應用程式都可以將資料匯出成為 CSV 檔案,若您的使用者手頭上已經有個用試算表(如 Excel)建立的資料檔,那麼他可以將資料先匯出成 CSV 格式的檔案,再一次塞進您的資料庫中。 | |
| 那麼,該如何處理這個 CSV 檔案呢? | |
我的做法 | |
| 這兒已經為您準備了一個現成的 CSV 檔,請您先下載回去,等會兒還用得著。如果您沒看過 CSV 檔案內容的話,您可以用「記事本」之類的文字編輯器,將這個檔案打開來看看。 | |
| 在這個 CSV 檔中,每列有五個欄位,分別是「sid」、「snum」、「sname」、「birthday」與「phone」,下列的範例也是針對這五個欄位而設計的,可能會與您本身的狀況不同。 | |
| 1. 上傳 CSV 檔 | |
| 首先,您得讓使用者將 CSV 檔上傳到伺服器上頭,您可以試試以下的範例。 | |
2. 取得 CSV 檔的內容 | |
| 待使用者上傳檔案之後,我們可以使用 fopen( ) 與 fgetcsv( ) 函數來取出其內容。其中的 $CSVfile 是配合上個範例而定的,您不一定會與我的相同。 | |
| 使用 fgetcsv( ) 函數取出 CSV 檔之內容時,一次會取出其中一列資料,並依逗號分隔位置,將該列資料拆成一個一個的欄位,以陣列的型態傳回來。 | |
| 以上方的 CSV 資料為例,第一次使用 $ROW = fgetcsv($fp, $CSVfile_size) 時,傳回來的 $ROW 是個陣列,其內容是: $ROW[0]:91001 $ROW[1]:1 $ROW[2]:張三 $ROW[3]:850506 $ROW[4]:7235300 | |
| 因此,我們可以使用 While 迴圈將其內容一列一列讀出來。 | |
| <? $fp = fopen($CSVfile, "r"); while ( $ROW = fgetcsv($fp, $CSVfile_size) ) { ...... } fclose($fp); ?> | |
| 在 fgetcsv( ) 裡所用到的第二個參數是該列的長度,由於我沒去計算該列的實際長度,所以偷個懶,直接用 $CSVfile_size 代替,反正遇到 EOF 或 newline 字元時,會自動中斷讀取的動作。此外,如果您的 CSV 檔不是以逗號當作欄位間隔的話,可以加上第三個參數,在此指定你所需的分隔字元。 | |
3. 組成 SQL 字串 | |
| 搭配上一步驟的動作,我們在 While 迴圈之中組合出所要的 SQL 字串。在讀取的過程中,遇到空的資料列時,會自動略過不予處理。 | |
| <? $temp_SQL = ""; // 解析 CSV 檔之內容,並組成 SQL 字串 $fp = fopen($CSVfile, "r"); while ( $ROW = fgetcsv($fp, $CSVfile_size) ) { // 在資料列有內容時(長度大於 0),才做以下動作 if ( strlen($ROW[0]) ) { // 如果 $temp_SQL 已經存有內容的話,與之後的內容間,用逗號隔開來 if ( strlen($temp_SQL) ) $temp_SQL .= ", "; $temp_SQL .= "('" . $ROW[0] . "', '" . $ROW[1] . "', '" . $ROW[2] . "', '" . $ROW[3] . "', '" . $ROW[4] . "') "; } } fclose($fp); $SQL = "INSERT INTO student (sid, snum, sname, birthday, phone) VALUES " . $temp_SQL; ?> | |
接下來,只要執行 $SQL,就可以將整批資料一次「塞」進資料庫裡了。 | |
進階做法 | |
| 由於每個 record 的各個欄位之間是用逗號分隔的,萬一某個欄位的資料中含有逗號的話,將干擾其它欄位資料的正確性。對此,我們可以將使用者上傳的 CSV 檔案內容先解析,並列在畫面上,讓使用者自行校對一下,以避免這類的錯誤。 |
資料批次處理:匯入 CSV 檔 CSV(Comma Separated Value) fgetcsv( )
博客涉及CSV、SQL、Excel等信息技术相关内容,包含如插入操作、处理换行符等,还提及函数式编程相关概念。
我的做法

被折叠的 条评论
为什么被折叠?



