資料批次處理:匯入 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 檔案內容先解析,並列在畫面上,讓使用者自行校對一下,以避免這類的錯誤。
一、基础信息 数据集名称:Bottle Fin实例分割数据集 图片数量: 训练集:4418张图片 验证集:1104张图片 总计:5522张图片 分类类别: - 类别0: 数字0 - 类别1: 数字1 - 类别2: 数字2 - 类别3: 数字3 - 类别4: 数字4 - 类别5: 数字5 - 类别6: Bottle Fin 标注格式:YOLO格式,包含多边形坐标,适用于实例分割任务。 数据格式:图片格式常见如JPEG或PNG,具体未指定。 二、适用场景 实例分割AI模型开发:数据集支持实例分割任务,帮助构建能够精确识别和分割图像中多个对象的AI模型,适用于对象检测和分割应用。 工业自动化与质量控制:可能应用于制造、物流或零售领域,用于自动化检测和分类物体,提升生产效率。 计算机视觉研究:支持实例分割算法的学术研究,促进目标检测和分割技术的创新。 教育与实践培训:可用于高校或培训机构的计算机视觉课程,作为实例分割任务的实践资源,帮助学生理解多类别分割。 三、数据集优势 多类别设计:包含7个不同类别,涵盖数字和Bottle Fin对象,增强模型对多样对象的识别和分割能力。 高质量标注:标注采用YOLO格式的多边形坐标,确保分割边界的精确性,提升模型训练效果。 数据规模适中:拥有超过5500张图片,提供充足的样本用于模型训练和验证,支持稳健的AI开发。 即插即用兼容性:标注格式直接兼容主流深度学习框架(如YOLO),便于快速集成到各种实例分割项目中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值