比对两个行式工作表的差异
例题描述和简单分析
文件data.xlsx有2个行式sheet,两者格式相同,A列都是逻辑主键,Sheet2的数据比Sheet1新。具体如下:
Sheet1:
A | B | |
1 | A1 | AV1 |
2 | A2 | AV2 |
3 | A3 | AV3 |
4 | A4 | AV4 |
5 | A5 | AV5 |
Sheet2:
A | B | |
1 | A1 | AV100 |
2 | A2 | AV2 |
3 | A3 | AV3 |
4 | A4 | AV4 |
5 | A6 | AV6 |
现在要找到sheet2和sheet1的差异,并分别写入新的sheet。其中sheet added存储所有新增的数据,即:
A | B | |
1 | A6 | AV6 |
sheet removed存储所有删掉的数据,即:
A | B | |
1 | A5 | AV5 |
sheet modified存储所有修改(主键不变,其他列变化)的记录,即:
A | B | |
1 | A1 | AV100 |
上述算法涉及记录的归并和集合运算
解法及简要说明
编写下面的集算器脚本,并执行:
A | B | C | |
1 | =file("050/data.xlsx") | ||
2 | =A1.xlsopen() | ||
3 | =A2.xlsimport(;"Sheet1") | =A2.xlsimport(;"Sheet2") | |
4 | =[B3,A3].merge@od(_1) | =[A3,B3].merge@od(_1) | =[[B3,A3].merge@od(), A4].merge@od() |
5 | =A2.xlsexport(A4;"added") | =A2.xlsexport(B4;"removed") | =A2.xlsexport(C4;"modified") |
6 | =A1.xlswrite(A2) |
A1-B3,A5-C6:在Excel文件中读取/写入sheet。
A4:通过比对第1列,对B3和A3进行差集运算,从而算出新增的数据。函数merge实现归并运算,@o表示对内存数据进行不排序归并,@d表示归并中计算差集。
B4:算出删除的数据。
C4:先通过比对整行,算出新增或修改的数据。再将该中间结果与A4比对整行,算出修改的数据。由于第二步比对的是同一个序表中的数据,因此可以直接用集合差集进行计算,即:=[B3,A3].merge@od() \ A4
英文版