两个 CSV 文件按指定列对齐并比较不同

例题描述和简单分析

data1.csvdata2.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())

问答搜集

https://stackoverflow.com/questions/63887147/comparing-2-csv-files-in-powershell-and-output-the-differences