月末需要对系统注册用户进行报表统计,在使用Navicat从MySQL数据库中导出数据到excel文件时,发现最大只能导出为65536(美好的数字)行的数据。按理说 Navicat应该是从数据库中读取一条记录会立即写到excel文件中,不应该只读取65536范围内的数据然后一次性写到文件里面。
鉴于Navicat的限制,只能想想其它办法了,这里选择使用shell脚本来处理。如下图所示,在Navicat中对select出来的数据右键,然后选择复制为
-制表符分隔值(字段名和数据)
把select出来的数据粘贴到任意文本文档中。如此就可以通过shell脚本对这个文本文档进行处理,最后输出为excel文件。
程序比较简单,处理时有两个需要注意的地方。第一,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 | |
---|