使用shell脚本解决Navicat导出excel数据不全的问题

2018-02-08 10:21:41来源:https://typecodes.com/linux/navicatxportoverflow1.html作者:TypeCodes人点击

分享

月末需要对系统注册用户进行报表统计,在使用Navicat从MySQL数据库中导出数据到excel文件时,发现最大只能导出为65536(美好的数字)行的数据。按理说 Navicat应该是从数据库中读取一条记录会立即写到excel文件中,不应该只读取65536范围内的数据然后一次性写到文件里面。


1 问题转换

鉴于Navicat的限制,只能想想其它办法了,这里选择使用shell脚本来处理。如下图所示,在Navicat中对select出来的数据右键,然后选择 复制为 - 制表符分隔值(字段名和数据) 把select出来的数据粘贴到任意文本文档中。如此就可以通过shell脚本对这个文本文档进行处理,最后输出为excel文件。



2 脚本代码

程序比较简单,处理时有两个需要注意的地方。第一,excel会把较大的数字采用科学记数法显示,可以采用在数字前面添加 ` 反引号解决;第二,一般Windows下的编码为gbk,如果Linux环境默认的是utf-8的格式,那么shell最后生成的excel文件中的汉字是乱码的,所以最好通过 iconv 工具提前把文件转换成gbk格式。



#!/bin/bash
# FileName:navicatxportoverflow1.sh
# Description: 使用shell脚本解决Navicat导出excel数据不全的问题
# Simple Usage:sh navicatxportoverflow1.sh file_name.txt
# (c) 2018.02.07 vfhky https://typecodes.com/linux/navicatxportoverflow1.html
# https://github.com/vfhky/shell-tools/blob/master/filehandle/navicatxportoverflow1.sh
dst_file=$1
dst_ile_name=$(basename ${dst_file})
dst_ile_name_prefix=${dst_ile_name%.*}
cp ${dst_file} ${dst_ile_name_prefix}.tmp
sed -i 's//t/,/g' ${dst_ile_name_prefix}.tmp
awk -F',' '{print $1",`"$2","$3}' ${dst_ile_name_prefix}.tmp > ${dst_ile_name_prefix}.tmp1
iconv -f "utf-8" -t "gbk" ${dst_ile_name_prefix}.tmp1 > ${dst_ile_name_prefix}.csv
rm -rf ${dst_ile_name_prefix}.tmp ${dst_ile_name_prefix}.tmp1
exit 0


微信扫一扫

第七城市微信公众平台