*比对大 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
英文版 https://c.scudata.com/article/1725001689135