1
dongyx 2019-06-03 14:44:52 +08:00
直接用 diff 能够处理吗?
|
3
lonelinsky 2019-06-03 16:01:20 +08:00
先外部 sort 排序之后,然后两个文件同时读着处理下? 不过文件有点大,不太确定 sort 命令的性能。
|
4
liprais 2019-06-03 16:07:25 +08:00 1
不能用数据库就学学数据库怎么做的呗
文件 1 文件 2 都按年龄分桶,然后每个桶对应的去比较呗 你地址格式化的好的话也可以先按地址分桶再按年龄分桶,然后随便搞个 hash 查找就行了 或者你可以用 pandas........ |
7
dongyx 2019-06-04 11:22:50 +08:00 1
@praynise 哦哦,那你可以这样做,先把两个文件按照客户 id 做外排序。然后利用类似于归并排序的归并过程。
我给你准备了一个简单的 sample: $ cat before.txt Smith 26 Beijing Sam 47 Washington Mary 15 Tokyo $ cat after.txt Smith 26 Beijing Sam 57 Washington Nancy 21 Paris 这个 Sample 里,新增了 Nancy,删除了 Mary,修改了 Sam。 先做外排序: $ sort -k1 before.txt > sorted_before.txt $ sort -k1 after.txt > sorted_after.txt 然后利用归并过程来实现你的需求,具体是这样的: 两个迭代器或者指针 fp_before, fp_after 分别指向 sorted_before.txt 和 sorted_after.txt 的第一行,进行如下迭代: 1. 如果 before_key > after_key,说明 after 中的第一行是新增的,输出结果,fp_after 移动到下一行 2. 如果 before_key < after_key,如果 before 中的第一行被删除了,输出结果,fp_before 移动到下一行 3. 如果 before_key == after_key,两个指针都移动下一行,但是移动前先对比当前两条记录,如果不一致,说明修改了 迭代完后,如果 fp_before 没有到文件末尾,那么剩下的内容都会被删除的记录;如果 fp_after 没有到末尾,那么剩下的内容都会新增的记录。 很遗憾,我不会 Go,用 Python3 写了份代码供你参考,时间有限写得不好请见谅: #!/usr/env/python3 # -*- coding: utf-8 -*- with open("sorted_before.txt") as fp_before, \ open("sorted_after.txt") as fp_after: before = fp_before.readline() after = fp_after.readline() while before and after: before = before.rstrip() after = after.rstrip() before_key = before.split()[0] after_key = after.split()[0] if after_key < before_key: print("+", after) after = fp_after.readline() elif after_key > before_key: print("-", before) before = fp_before.readline() else: if before != after: print(' ', before, "=>", after) before = fp_before.readline() after = fp_after.readline() for before_surplus in fp_before: print("-", before_surplus) for after_surplus in fp_after: print("+", after_surplus) 这份代码跑上面的 sample 的结果: - Mary 15 Tokyo + Nancy 21 Paris Sam 47 Washington => Sam 57 Washington |
8
dongyx 2019-06-04 11:24:46 +08:00
Python 的缩进粘贴过来没有了,我给个 gist 吧: https://gist.github.com/dongyx/a052cadf160896b879cdfb4d48e2f038
|
9
dongyx 2019-06-04 11:32:34 +08:00
typo:
2. 如果 before_key < after_key,*如果* before 中的第一行被删除了,输出结果,fp_before 移动到下一行 => 2. 如果 before_key < after_key,*说明* before 中的第一行被删除了,输出结果,fp_before 移动到下一行 |