背景:有多个以时间命名的文件夹,每个文件夹下又有超过100个的csv文件,其中每个文件中的数据对应的表也不都完全一致,好在每个文件的命名格式为:表名-时间.csv。现在需要把这些文件夹下的文件都导入的MySQL数据库对应的表中
注:因为有些表的字段中有关键字符,故直接load data into table会报错,所以脚本中还拼接了所有字段信息
如下脚本可以批量自动实现上述功能
#!/bin/bash
cur_dir=`dirname $0`
dir_list=(`ls -l ${cur_dir}|grep '^d'|awk -F' ' '{print $9}'`)
lenth=${#dir_list[@]}
for dirname in ${dir_list[@]};do
echo $dirname
file_list=(`ls -l ${cur_dir}/${dirname}|grep '^-'|grep '.*csv$'|awk -F' ' '{print $9}'`)
for file in ${file_list[@]};do
table_name=${file%%-*}
echo ${cur_dir}/${dirname}/${file}
echo $cmd
mysql -uroot -p***** -N -f --local-infile=1 test > exec.sql<<EOF
select "SET GLOBAL foreign_key_checks=0;"; ###这一部分最好提前保留原参数,或者是参数设置为session级别
select "SET GLOBAL unique_checks=0;";
select "SET GLOBAL innodb_flush_log_at_trx_commit=0;";
select "set session group_concat_max_len=8000;"; ##这个参数是限制拼接字符串的长度,默认较小,拼接超长会被自动截断
select "SET GLOBAL sync_binlog=0;";
select "SET session sql_mode='ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';";
select concat
('load data local infile \\"${cur_dir}/${dirname}/${file}\\" replace into table ${table_name} character set utf8mb4 FIELDS TERMINATED BY '','' OPTIONALLY ENCLOSED BY '
'\\"'' lines terminated by ''\\n'' ignore 1 lines (',
GROUP_CONCAT(column_name,""),');')
from information_schema.columns where table_name='${table_name}';
EOF
mysql -uroot -p**** -N -f --local-infile=1 test < exec.sql
done
done