查找 CSV 与 JSON 的不同
【问题】
let’s say i have two CSV file. file 1 defines standard csv data file & File 2 is the mapping file of file 1 & Json now what i want is i want to map those two files and compare the data of File 1 with the Json. & output the mismatch as a csv.
how do i achieve that?
File 1:
key,id,value,name,number
1,322,re43,dasu,555-456
File 2:
Rsat_key,key
Retina_id,id
reason_value,value
real_name,name
work_ph,phone
Json
{
"Rsat_key":1,
"Retina_id":322,
"reason_value":,
"real_name":dasu,
"work_ph":,555-456,
}
【回答】
File1 和 Json 都是多行结构化数据,要比较它们的差异,只需按关键字进行 join 运算再条件查询就可以。但 JAVA 缺乏结构化计算类库,实现过程复杂,代码可读性差。这种情况下可以用集算器辅助实现,SPL 代码更直观易懂:
A |
|
1 |
=file("f1.csv").import@ct() |
2 |
=file("f2.csv").import@ct() |
3 |
=json(file("3.json").read()) |
4 |
=condition=A2.("_1."+_2+"!=_2."+_1).concat("||") |
5 |
=join@1(A1,${csvKey};A3,${A2.select(_2==csvKey)._1}) |
6 |
=A5.select(${condition}) |
A1:读取 f1.csv 文件的记录及列名
A2:读取 f2.csv 文件,没有列名,默认为 _1、_2
A3:读取 json 内容,并解析为结构化数据
A4:拼凑查询条件字符串
A5:join 运算。csvKey 是参数,代表 File1 的主键。函数 join 默认是内连接,@1 表示左连接。${} 表示将字符串动态解析为表达式。
A6:对 A5 做条件查询,返回满足条件的记录
JAVA 可通过 JDBC 接口调用集算器,参考【Java 如何调用 SPL 脚本】。