找出文本文件中最大值的所在行

某个 csv 文件分隔符是分号,含有 "unknown" 的字段值表示数据无效。

name;height;mass;hair_color;skin_color;eye_color;birth_year;gender

Luke Skywalker;172;77;blond;fair;blue;19BBY;male

C-3PO;167;75;n/a;gold;yellow;112BBY;n/a

R2-D2;96;32;n/a;white, blue;red;33BBY;n/a

Darth Vader;202;136;none;white;yellow;41.9BBY;male

Leia Organa;150;49;brown;light;brown;19BBY;female

Owen Lars;178;120;brown, grey;light;blue;52BBY;male

Beru Whitesun lars;165;75;brown;light;blue;47BBY;female

Grievous;216;159;none;brown, white;green, yellow;unknown;male

Lily;216;159;none;brown, white;green, yellow;unknown;male

unknown;unknown;216;black;dark;dark;unknown;male

Rey;unknown;unknown;brown;light;hazel;unknown;female

Poe Dameron;unknown;unknown;brown;light;brown;unknown;male

需要用 Java 过滤出 mass 字段最大值所在的行的 name 字段,要求:将数据转为流式再处理;跳过无效数据;如果有多个 name 符合要求,则用分号拼合起来,比如:Grievous;Lily

编写SPL脚本:


A

1

=T@c("data.csv"; ";")

2

=A1.select(mass!="unknown" && name!="unknown")

3

=A2.total(top(1;-mass))

4

=A3.(name).concat(";")

A1: 将 csv 文件解析为流式的二维表,@c 表示游标。

A2:过滤掉无效数据。

A3:找出 mass 字段值是 topN 的记录。

A4:取出 name 字段所有的值,并用分号合并。

Java 集成 SPL 可参考 Java 如何调用 SPL 脚本

问题来源:https://stackoverflow.com/questions/72018171/filtering-from-csv-files-using-java-stream