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