某 csv 文件不规范,奇数行为主表记录,一行对应一条记录,有 3 个字段 idUniversity、nameOfUniversity、noOfBuses,其中第 3 个字段是冗余的,用来指明偶数行上子表记录的记录数量。偶数行为子表记录,一行有 N 项,每两项对应一条记录,有 2 个字段 idBus,noOfBus。
1,Harvard University,2 1,140,2,56 2,Massachusetts Institute of Technology,2 1,240,5,56 3,University of California Berkeley,3 1,112,2,56,3,28 4,Columbia University,4 1,84,2,84,3,84,7,28 |
要求:用 Java 解析主子表,数据结构要方便后续计算。
idUniversity | nameOfUniversity | noOfBuses | |
1 | Harvard University | idBus | noOfBus |
1 | 140 | ||
2 | 56 | ||
2 | Massachusetts Institute of Technology | idBus | noOfBus |
1 | 240 | ||
5 | 56 | ||
3 | University of California Berkeley | idBus | noOfBus |
1 | 112 | ||
2 | 56 | ||
3 | 28 | ||
4 | Columbia University | idBus | noOfBus |
1 | 84 | ||
2 | 84 | ||
3 | 84 | ||
7 | 28 |
编写SPL代码
1 | =file("d:/data.csv").import@cw() |
2 | =A1.group((#-1)\2) |
3 | =A2.new(~1(1):idUniversity,~1(2):nameOfUniversity,~2.group((#-1)\2).new(~1:idBus,~2:noOfBus):noOfBuses) |
A1:将文件解析为二维序列,分隔是逗号。
A2:每两行分一组。
A3:将每组的第 1 行解析为主表记录,第 2 行解析为多条子表记录,作为主表的字段。
上面 SPL 代码已经建立了主子关联,可以用点号访问子表,比如查询第 2 条主表记录的子表里 idBus 大于 2 的记录,直接写:=A3(4).noOfBuses.select(idBus>2)
Java 集成 SPL 可参考 Java 如何调用 SPL 脚本
SPL开源地址