比对大 csv 文件

有两个同构的大 csv 文件 A 和 B,主键是 KEY_A、KEY_B、KEY_C,两者有部分数据不同。

A.csv

B.csv

KEY_A,KEY_B,KEY_C,V1,V2

a0,b0,c0,v0,v0

a1,b1,c1,v1,v2

a2,b2,c2,v2,v200

a4,b4,c4,v400,v4

a3,b3,c3,v3,v3

m1,p1,q1,v1,v1

m1,p2,q2,v1,v1

m1,p1,q2,v1,v1

m1,p2,q1,v1,v1

KEY_A,KEY_B,KEY_C,V1,V2

a1,b1,c1,v1,v2

a2,b2,c2,v200,v200

a3,b3,c3,v300,v3

a4,b4,c4,v4,v400

a,b,c,v,v

m1,p1,q1,v1,v1

请用 Java 对两个文件进行三种比较,将比较结果分别写入新的 csv 文件。第 1 种比较:找出主键相等且其他字段不相等的记录,先输出主键,再输出 A 的其他字段和 B 的其他字段。

KEY_A,KEY_B,KEY_C,V1,V2,V1,V2

a2,b2,c2,v2,v200,v200,v200

a3,b3,c3,v3,v3,v300,v3

a4,b4,c4,v400,v4,v4,v400

第 2 种比较:以主键为比较标准,找出 A 和 B 的差集,即 A 有而 B 没有的记录。

KEY_A,KEY_B,KEY_C,V1,V2

a0,b0,c0,v0,v0

m1,p1,q2,v1,v1

m1,p2,q1,v1,v1

m1,p2,q2,v1,v1

第 3 种比较:以主键为比较标准,找出 B 和 A 的差集。

KEY_A,KEY_B,KEY_C,V1,V2

a,b,c,v,v

编写SPL代码。第1种比较:



A

1

=T@c("A.csv")

=T@c("B.csv")

2

=A1.sortx(KEY_A,KEY_B,KEY_C)

=B1.sortx(KEY_A,KEY_B,KEY_C)

3

=joinx(A2,KEY_A,KEY_B,KEY_C;B2,KEY_A,KEY_B,KEY_C)


4

=A3.select(#1.V1!=#2.V1 || #1.V2!=#2.V2)


5

=A4.new(#1.KEY_A,#1.KEY_B,#1.KEY_C,#1.V1,#1.V2,#2.V1,#2.V2)


6

=T("r1.csv":A5)


2种比较(第3种比较类似,此处省略):



A

1

=T@c("A.csv")

=T@c("B.csv")

2

=A1.sortx(KEY_A,KEY_B,KEY_C)

=B1.sortx(KEY_A,KEY_B,KEY_C)

3

=[A2,B2].merge@d(KEY_A,KEY_B,KEY_C)


4

=T("r2.csv":A3)


函数T可解析或写入csv文件,@c表示用游标读取远超内存的文件,sortx用于游标排序,joinx用于归并关联,merge用于记录归并,@d表示差集。

Java 集成 SPL 可参考 Java 如何调用 SPL 脚本
问题来源:https://stackoverflow.com/questions/73748916/iterating-massive-csvs-for-comparisons