月末需要对系统注册用户进行报表统计,在使用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格式。
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 »