编写Bash脚本通过LOAD DATA LOCAL INFILE批量导入CSV到MySQL
参数化Bash脚本批量导入CSV到数据库
以下是满足需求的参数化Bash脚本,支持批量遍历指定文件夹内的CSV文件,通过LOAD DATA LOCAL INFILE命令导入到目标数据库表:
#!/bin/bash # 校验参数数量 if [ $# -ne 4 ]; then echo "用法: $0 <InputFolderPath> <DatabaseConnection> <SchemaName> <TableName>" echo "示例: $0 /home/user/csv_files 'mysql -u admin -pMyPass123 --local-infile=1 -h db-host' my_db sales_data" exit 1 fi INPUT_FOLDER="$1" DB_CONN_CMD="$2" TARGET_SCHEMA="$3" TARGET_TABLE="$4" # 遍历目标文件夹下所有CSV文件 for csv_path in "$INPUT_FOLDER"/*.csv; do # 处理文件夹无CSV文件的情况 [ -f "$csv_path" ] || continue echo "开始导入: $csv_path" # 执行数据库导入命令 $DB_CONN_CMD -e " USE $TARGET_SCHEMA; LOAD DATA LOCAL INFILE '$csv_path' INTO TABLE $TARGET_TABLE FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\n' IGNORE 1 ROWS; " # 反馈导入结果 if [ $? -eq 0 ]; then echo "$csv_path 导入完成" else echo "$csv_path 导入失败,请检查文件格式或数据库配置" fi done
核心说明
参数定义
InputFolderPath:存放待导入CSV文件的文件夹绝对/相对路径DatabaseConnection:完整的数据库连接命令(以MySQL为例),需包含必要的认证、主机及LOCAL INFILE启用参数SchemaName:目标数据库(或Schema)名称TableName:接收数据的目标表名
自定义配置项
根据你的CSV格式,可修改LOAD DATA语句中的以下参数:
FIELDS TERMINATED BY ',':字段分隔符(如制表符可改为'\t')ENCLOSED BY '\"':字段包裹符(若CSV无包裹符可删除此行)IGNORE 1 ROWS:跳过表头行(无表头则删除此行)
必要前提
- 数据库客户端需启用
LOCAL INFILE支持(MySQL需在连接命令中添加--local-infile=1) - 执行脚本的用户需具备CSV文件读取权限,以及数据库表的写入权限
- 目标表结构需与CSV字段顺序、类型匹配
内容的提问来源于stack exchange,提问作者RobinHood
相关产品推荐
相关产品推荐

