TypeCodes

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

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

1 问题转换

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

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

2 脚本代码

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#!/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
打赏支持

Comments »