解析主子格式的 csv
某 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 脚本
问题来源:https://stackoverflow.com/questions/71957483/parsing-comma-delimited-text-file-with-alternating-data-rows-using-the-java-stre
英文版 https://c.scudata.com/article/1725352011981