比较两个文件的不同 - Shuang0420/Shuang0420.github.io GitHub Wiki
对懒人来说,最先考虑的当然是用现有的软件功能,比如说UltraEdit的比较文件功能,比较结果如下图,红色表示不同,黑色表示相同,空白表示另一方有而这一边没有。然而这可视化效果不是很强,要求文件排序一致,如果要用的话,最好先排个序。
首先要保证两个文件编码一致,且换行符等符号表示一致。 我们知道,\r\n(回车换行)是 window 上的换行符,\n(换行)是 linux 上的换行符,通过UltraEdit(UE)可以将换行符统一。
- \r\n(回车换行)转化为\n(换行),文件-->转换到-->行终结符(Unix(LF))
- \n(换行)转化为\r\n(回车换行),文件-->转换到-->行终结符(Windows(CRLF))
grep -F -v -f small.txt large.txt > minus.txt
grep -F -f a.txt b.txt > common.txt
shell里强大的diff命令可以直接比较两个文件。diff的更多用法见参考链接。
# diff log2014.log log2013.log 3c3 < 2014-03 --- > 2013-03 8c8 < 2013-07 --- > 2013-08 11,12d10 < 2013-11 < 2013-12 上面的“3c3”和“8c8”表示log2014.log和log20143log文件在3行和第8行内容有所不同;"11,12d10"表示第一个文件比第二个文件多了第11和12行。以”<”打头的行属于第一个文件,以”>”打头的行属于第二个文件。
这对于短小的文件或者说差异不大的文件或许ok,但对于我几十万行的文件几万行的不同就委实难以阅读了。
下面介绍用进行比较文件的方法,适合于量大的数据以及需要产生比较文件(增删改了多少)的场合。
数据库建表
# 在excel数据库里建立new和old两张表 USE `excel`; CREATE TABLE `new` ( `uq` varchar(300) CHARACTER SET utf8 DEFAULT NULL, `fq` varchar(550) CHARACTER SET utf8 DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE `old` ( `uq` varchar(300) DEFAULT NULL, `fq` varchar(550) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
连接数据库
def connectDb():
global cur,conn
conn= MySQLdb.connect(
host='127.0.0.1',
port = 3306,
user='root',
passwd='',
db ='excel',
charset='utf8',
)
cur = conn.cursor()
cur.execute("USE excel")
导入newfaqs,oldfaqs里的两份文件,文件格式为两列,制表符隔开。
f=open('newfaqs','r')
for line in f:
if (len(line.split('\t'))==2):
uq=line.split('\t')[0]
fq=line.split('\t')[1]
try:
cur.execute("INSERT IGNORE INTO `old_v` VALUES ('" + uq + "','"+ fq + "')")
conn.commit()
except:
conn.rollback()
f=open('oldfaqs','r')
for line in f:
if (len(line.split('\t'))==2):
uq=line.split('\t')[0]
fq=line.split('\t')[1]
try:
cur.execute("INSERT IGNORE INTO `new` VALUES ('" + uq + "','"+ fq + "')")
conn.commit()
except:
conn.rollback()
else:
continue
用sql语句进行比较,找出newfaqs里相对于oldfaqs删除/添加的行(包括了有改动的行)
USE excel;
SELECT * FROM old_v
WHERE NOT EXISTS
(SELECT * FROM NEW
WHERE new.uq = old_v.uq
);
USE excel;
SELECT * FROM new
WHERE NOT EXISTS
(SELECT * FROM old_v
WHERE new.uq = old_v.uq
);
如果有需要可以从数据库导出数据查看,可能导出csv会出现中文乱码的情况,转成gbk就好啦。
