比对两个行式工作表的差异
例题描述和简单分析
文件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
英文版