找出文本文件中最大值的所在行
某个 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
英文版