两个 CSV 文件按指定列对齐并比较不同
例题描述和简单分析
data1.csv和data2.csv结构(列名)相同,且id列都是唯一标识列。二者id列的数据相同,但其他列的数据有可能不同。
data1.csv
id,v1,v2 1001,1001_v1,1001_v2 1002,1002_v1,1002_v2 1003,1003_v1,1003_v2 1004,1004_v1,1004_v2 1005,1005_v1,1005_v2 … |
data2.csv
id,v1,v2 1005,1005_v2,1005_v1 1001,1001_v1,1001_v2 1002,1002_v1c,1002_v2 1003,1003_v1c,1003_v2c 1004,1004_v1,1004_v2 … |
现在要找出两个文件其他列的不同之处,并输出到result.csv里。具体要求是:对于相同的id,如果data2.cvs里本行的其他任意一列与data1.csv对应的列不同,则输出data2.csv里的这一行。部分结果如下:
result.csv
id,v1,v2 1002,1002_v1c,1002_v2 1003,1003_v1c,1003_v2c 1005,1005_v2,1005_v1 … |
上面算法涉及有序归并和差集。
解法及简要说明
在集算器中编写如下脚本:
` |
A |
1 |
=file("041/data1.csv").import@ct() |
2 |
=file("041/data2.csv").import@ct() |
3 |
=[A2,A1].merge@od() |
4 |
=file("result.csv").export@ct(A3) |
A3:两文件做归并,@o 可对内存无序数据做归并,@d 表示求差集。不指定要比较的列,则表示对整行做比较。
上述脚本也可以写在命令行里,如下:
d:\raqsoft64\esProc\bin> .\esprocx -r file(\"result.csv\").export@ct([file(\"data2.csv\").import@ct(),file(\"data1.csv\").import@ct()].merge@d()) |
英文版