csv 文件去重后排序
csv 文件体积较大,Center 列是分类,其他列组成明细,组内明细有重复。
Id,Name,Mother,Birth,Center 1,Antonio Carlos da Silva,Ana da Silva,2008/03/31,1 2,Carlos Roberto de Souza,Amalia Maria de Souza,2004/12/10,1 3,Pedro de Albuquerque,Maria de Albuquerque,2006/04/03,2 4,Danilo da Silva Cardoso,SOnia de Paula Cardoso,2002/08/10,3 5,Ralfo dos Santos Filho,Helena dos Santos,2012/02/21,4 6,Pedro de Albuquerque,Maria de Albuquerque,2006/04/03,2 7,Antonio Carlos da Silva,Ana da Silva,2008/03/31,1 8,Paula Cristina de Abreu,Cristina Pereira de Abreu,2014/10/25,2 9,Rosana Pereira de Campos,Ivana Maria de Campos,2002/07/16,3 10,Pedro de Albuquerque,Maria de Albuquerque,2006/04/03,2 |
要求用 Java 进行流式读取和计算:取出组内重复的记录,让这些记录按 Center 列排序,按 Center,Id,Name,Mother,Birth 的列顺序写入新文件。
Center,Id,Name,Mother,Birth 1,1,Antonio Carlos da Silva,Ana da Silva,2008/03/31 1,7,Antonio Carlos da Silva,Ana da Silva,2008/03/31 2,3,Pedro de Albuquerque,Maria de Albuquerque,2006/04/03 2,6,Pedro de Albuquerque,Maria de Albuquerque,2006/04/03 2,10,Pedro de Albuquerque,Maria de Albuquerque,2006/04/03 |
编写SPL脚本:
A |
|
1 |
=T@c("data.csv") |
2 |
=A1.sortx(Center,Name,Mother,Birth) |
3 |
=A2.group(Center,Name,Mother,Birth) |
4 |
=A3.select(~.len()>1).conj() |
5 |
=T("result.csv":A4,Center,Id,Name,Mother,Birth) |
A1:流式读取大于内存的 csv 文件,返回游标。
A2:按 Center、Name、Mother、Birth 进行排序。
A3:分组但不汇总。
A4:取出成员个数大于 1 的组,合并各组成员。
A5:将游标写入 csv 文件,指定字段顺序。
Java 集成 SPL 可参考 Java 如何调用 SPL 脚本
问题来源:https://stackoverflow.com/questions/68651921/java-stream-retrieving-repeated-records-from-csv
英文版 https://c.scudata.com/article/1722850222039