mysql从csv数据文件恢复数据

原创
2020/03/17 09:43
阅读数 633

分析csv数据文件特征

csv是英文"Comma-Separated Values"的缩写,意为"逗号分隔值"。csv文件称为逗号分隔值文件,或者逗号分隔府文件。
显著的特征就是每个字段间由逗号分隔(是半角逗号',')。
一般情况每个字段真实数据都会被一组符号包括着,像是单引号,双引号等以避免字段真实数据含有与分隔符相冲突的符号。
还有就是EOL的问题,避免特殊问题产生,一个文件的行末结束符最好是统一的。
一般的Unix的文件以'\n'结束,Windowns以'\r\n'结束,MAC则是'\r'。虽然是一般性,但还是看具体文件。毕竟改动EOL不是难事。
最后还要注意下文件编码。

load data 语法

help load data;
LOAD DATA
    [LOW_PRIORITY | CONCURRENT] [LOCAL]
    INFILE 'file_name'
    [REPLACE | IGNORE]
    INTO TABLE tbl_name
    [PARTITION (partition_name [, partition_name] ...)]
    [CHARACTER SET charset_name]
    [{FIELDS | COLUMNS}
        [TERMINATED BY 'string']
        [[OPTIONALLY] ENCLOSED BY 'char']
        [ESCAPED BY 'char']
    ]
    [LINES
        [STARTING BY 'string']
        [TERMINATED BY 'string']
    ]
    [IGNORE number {LINES | ROWS}]
    [(col_name_or_user_var
        [, col_name_or_user_var] ...)]
    [SET col_name={expr | DEFAULT},
        [, col_name={expr | DEFAULT}] ...]
-- 大致使用参数如下
-- filename 文件翁,服务运行限制可能只允许在特定的目录加载文件,见`show variables like 'secure_file_priv';`
-- tbl_name 数据插入的表名
-- charset_name 数据文件字符集编码
-- string_ct 字段分隔符
-- char 字段两边的符号,不是分隔符
-- string_eol 行末结束符
-- number 忽略数据文件行数。一般前面一行是字段名的记录,非数据。
LOAD DATA INFILE 'filename' INTO TABLE tbl_name CHARACTER SET charset_name COLUMNS TERMINATED BY 'string_ct' ENCLOSED BY 'char' LINES TERMINATED BY 'string_eol' IGNORE number LINES;

导出数据转换为csv文件

mysql指令导出脚本(随手打的,只处理EOL为'\n'的文件,否则自行调整)
#!/bin/bash
user="root"
passwd="123456"
host=""
port="3306"
outfile="/tmp/output.csv"
CMD="mysql -u $user -p$passwd -h $host -p $port"
if [ ! $1 ]; then
    echo "$0 [sqlfile | SQL]"
    echo ""
    exit 1
fi
if [ -z "$outfile" ]; then outfile=/dev/tty; fi
if [ -f $1 ]; then
    $CMD < $1 > $outfile 2>/dev/null
else
    $CMD <<<"$*" > $outfile 2>/dev/null
fi
if [ "$outfile" != "/dev/tty"  -a -s "$outfile" ]; then
    sed -i 's/^/"/' $outfile
    sed -i 's/$/"/' $outfile
    sed -i 's/\t/","/g' $outfile
fi
exit 0
桌面环境下的mysql客户端工具都有导出csv功能的,仔细看下。(有这些工具直接导出sql形式就可以了)

注意:需要通过此方法迁移数据需要导出下表结构

SQL如下
-- table_name 导出的表名
show create table table_name;
自己构造的结果集需要自行构造目标表才能使用"LOAD DATA"

其他类似csv格式的文件也可以通过这种方式导入数据,指定下具体符号即可

其实slelect查询结果集直接录入就行:
LOAD DATA INFILE '/path/to/mysql-files/filename' INTO TABLE tbl_name CHARACTER SET utf8 COLUMNS TERMINATED BY '\t'  LINES TERMINATED BY '\n' IGNORE 1 LINES;
展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部