資料批次處理:匯入 CSV 檔 CSV(Comma Separated Value) fgetcsv( )

博客涉及CSV、SQL、Excel等信息技术相关内容,包含如插入操作、处理换行符等,还提及函数式编程相关概念。
問題說明
 通常我們提供給使用者的資料輸入介面,一次只能輸入一筆資料;若是使用者手頭上持有大量已數位化的資料時,他們一定會希望能一次「塞」進我們的資料庫中,而不是一筆一筆地鍵入。
 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 檔上傳到伺服器上頭,您可以試試以下的範例。
「上傳 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 檔案內容先解析,並列在畫面上,讓使用者自行校對一下,以避免這類的錯誤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值