如何导入单字段CSV文件并从文件名提取数据补充至MySQL表?
批量导入带命名规则的CSV到MySQL并补充文件名解析字段
我来给你一套实用的实现方案,不管是用脚本灵活处理还是用MySQL原生工具高效导入都能搞定,分两种常见场景来说明:
方法一:用Python脚本(灵活可控,适配复杂规则)
这种方式能轻松解析文件名规则,还能处理CSV格式的各种细节,步骤如下:
解析文件名提取标识字段
针对你提到的T001U020C075.csv这类命名,我们可以通过字符串拆分把标识映射到数据库字段,比如test_id=T001、user_id=U020、channel_id=C075:import os import csv import mysql.connector # 定义文件名解析逻辑 def parse_filename(filename): base_name = os.path.splitext(filename)[0] # 按固定长度拆分(假设每个标识都是4位,比如前缀+3位数字) test_id = base_name[0:4] user_id = base_name[4:8] channel_id = base_name[8:12] return test_id, user_id, channel_id连接数据库批量插入数据
遍历目标文件夹里的所有CSV,读取每一行测试结果,加上解析出的标识字段,批量插入到数据库表中:# 数据库连接配置 db_config = { 'host': '你的数据库地址', 'user': '数据库用户名', 'password': '数据库密码', 'database': '目标数据库名' } # CSV文件所在文件夹路径 csv_folder = '/path/to/your/csv/directory' conn = mysql.connector.connect(**db_config) cursor = conn.cursor() # 假设数据库表结构为:test_id, user_id, channel_id, result1, result2, result3 insert_sql = """ INSERT INTO test_results (test_id, user_id, channel_id, result1, result2, result3) VALUES (%s, %s, %s, %s, %s, %s) """ for filename in os.listdir(csv_folder): if filename.endswith('.csv'): test_id, user_id, channel_id = parse_filename(filename) csv_path = os.path.join(csv_folder, filename) with open(csv_path, 'r', encoding='utf-8') as f: reader = csv.reader(f) # 跳过CSV表头(如果你的文件有表头的话) next(reader) # 准备批量插入的数据 batch_data = [] for row in reader: # 把解析的标识字段和CSV行数据合并 batch_data.append((test_id, user_id, channel_id) + tuple(row)) # 执行批量插入 cursor.executemany(insert_sql, batch_data) conn.commit() print(f"成功导入 {filename} 中的 {len(batch_data)} 条数据") cursor.close() conn.close()
方法二:用MySQL原生LOAD DATA INFILE(高效,适合大文件)
如果你的CSV文件体积很大,用MySQL原生工具导入速度更快,需要先预处理文件名解析,生成对应的导入脚本:
编写批量导入脚本(以Bash为例,适用于Linux环境)
遍历所有CSV文件,为每个文件生成LOAD DATA语句,把文件名解析出的字段作为固定值插入:#!/bin/bash CSV_DIR="/path/to/your/csv/files" DB_USER="数据库用户名" DB_PASS="数据库密码" DB_NAME="目标数据库名" for file in $CSV_DIR/*.csv; do filename=$(basename "$file") base_name=${filename%.csv} # 解析文件名中的标识字段 test_id=${base_name:0:4} user_id=${base_name:4:4} channel_id=${base_name:8:4} # 执行MySQL导入命令 mysql -u$DB_USER -p$DB_PASS $DB_NAME << EOF LOAD DATA INFILE '$file' INTO TABLE test_results FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS (result1, result2, result3) SET test_id='$test_id', user_id='$user_id', channel_id='$channel_id'; EOF echo "完成导入: $filename" done注意:使用
LOAD DATA INFILE需要确保MySQL服务有权限读取目标CSV文件,并且secure_file_priv配置符合要求。执行脚本
给脚本添加执行权限:chmod +x import_csv.sh,然后运行./import_csv.sh即可批量完成导入。
关键注意事项
- 字段格式匹配:如果数据库字段只需要数字部分(比如
T001只存001),可以在解析文件名时处理,比如test_id = base_name[1:4]。 - CSV格式一致性:所有CSV文件的列数、顺序必须和数据库表中要插入的结果字段完全对应,避免插入报错。
- 事务保障:如果用脚本插入,建议添加事务处理逻辑,避免部分文件导入失败导致数据不一致。
内容的提问来源于stack exchange,提问作者R Loomas




