需將 CSV 格式文本檔 (含日期字串 2/8/2013 9:00:00 PM) 導入 MySQL,並將日期字串轉為 DATETIME 型別儲存。對比兩種方案:儲存過程 + 游標逐行處理 vs LOAD DATA 內建轉換。
DECLARE v_str VARCHAR(150); DECLARE v_dt DATETIME; DECLARE done INT DEFAULT FALSE;DECLARE cur CURSOR FOR SELECT get_time FROM raw_table;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;OPEN cur;FETCH cur INTO v_str; → 判斷 done → 處理 → 寫入目標表。CLOSE cur;
DELIMITER //
CREATE PROCEDURE sp_str_to_datetime()
BEGIN
DECLARE v_str VARCHAR(150);
DECLARE v_dt DATETIME;
DECLARE done INT DEFAULT FALSE;
DECLARE cur CURSOR FOR SELECT get_time FROM raw_data;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO v_str;
IF done THEN LEAVE read_loop; END IF;
-- 字串轉日期:格式 'M/D/YYYY h:mm:ss A'
SET v_dt = STR_TO_DATE(v_str, '%c/%e/%Y %l:%i:%s %p');
INSERT INTO clean_data (event_time) VALUES (v_dt);
END LOOP;
CLOSE cur;
SELECT * FROM clean_data LIMIT 10;
END //
DELIMITER ;
CALL sp_str_to_datetime();
| 符號 | 含義 | 範例 |
|---|---|---|
| %c | 月份 (1-12) | 2 |
| %e | 日期 (1-31, 含前導空格) | 8 |
| %Y | 4 位年份 | 2013 |
| %l | 12 制小時 (1-12, 含前導空格) | 9 |
| %i | 分鐘 (00-59) | 00 |
| %s | 秒 (00-59) | 00 |
| %p | AM/PM | PM |
MySQL LOAD DATA 支援 SET col = expr 子句,可在導入過程中直接轉換欄位值,無需中間表、無需游標循環,速度快數量級。
-- 1. 建立目標表
CREATE TABLE traindata (
id INT AUTO_INCREMENT PRIMARY KEY,
station_id VARCHAR(10),
get_time DATETIME,
PM25 INT, PM10 INT, NO2 INT,
temperature INT, pressure INT,
humidity INT, wind DOUBLE, weather INT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 2. 導入並轉換
LOAD DATA LOCAL INFILE 'f:\\dataset\\beijing\\crawleddata.txt'
INTO TABLE traindata
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 LINES -- 若有標題行
(station_id, @var_time, PM25, PM10, NO2, temperature, pressure, humidity, wind, weather)
SET get_time = STR_TO_DATE(@var_time, '%c/%e/%Y %l:%i:%s %p');
-- 3. 驗證
SELECT * FROM traindata LIMIT 10;
@var_time:用戶變數暫存原始 CSV 欄位值。SET get_time = STR_TO_DATE(@var_time, ...):導入時即時轉換,直接寫入目標欄位。FIELDS TERMINATED BY ',':CSV 分隔符。LINES TERMINATED BY '\n':換行符 (Windows 檔案可能為 \r\n)。IGNORE 1 LINES:跳過標題行。LOCAL:從客戶端讀取檔案 (需客戶端與 Server 皆啟用 local_infile=1)。| 指標 | 游標循環 | LOAD DATA |
|---|---|---|
| 100 萬行導入耗時 | ~30-60 分鐘 | ~10-30 秒 |
| 記憶體佔用 | 低 (逐行) | 中 (緩衝區) |
| 邏輯靈活度 | 高 (可行級複雜判斷) | 中 (僅支援表達式) |
| 事務控制 | 可精細控制 | 整個導入為一事務 (或關閉自動提交分批) |