解析主子格式的 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