如何实现检查一个大 txt 文件里数据是否重复的功能

2024-02-27 19:28:32 +08:00
1ven  1ven

如何实现检查一个大 txt 文件里数据是否重复的功能

如题,文件的每一行数据结构都是相同的,字段值通过一个自定义分隔符分割。比如有如下结构数据,id|name|bizNo ,检查 id 是否重复。

最好是 java 实现的
5059 次点击
所在节点   程序员  程序员
49 条回复
layxy
layxy
2024-02-28 09:29:23 +08:00
使用 BufferedReader 逐行读取,如果只需要排重使用 set 就可以,如果需要重复计数排序可以使用 map
guanzhangzhang
guanzhangzhang
2024-02-28 09:36:19 +08:00
@icedx #10 2K XD 是啥意思
o562dsRcFqYl375i
o562dsRcFqYl375i
2024-02-28 09:39:34 +08:00
要不咋们跳出单机器的思维,spark 一下?
o562dsRcFqYl375i
o562dsRcFqYl375i
2024-02-28 09:41:25 +08:00
@nutting 还是老哥想的周全
Greenm
Greenm
2024-02-28 09:43:21 +08:00
经常接触过这样的需求,如果不考虑一定要原始文件中字符的顺序,我的选择是 Linux 上的 sort | uniq ,流式处理速度非常快。
FreeEx
FreeEx
2024-02-28 09:50:47 +08:00
1ven
1ven
2024-02-28 10:12:57 +08:00
@FreeEx 上次我也看到过有人发过这个链接,就是找不到了,老哥知道原贴吗
815979670
815979670
2024-02-28 10:27:47 +08:00
duckDB 读入 用 SQL 查询出来?
Subfire
Subfire
2024-02-28 10:51:33 +08:00
用正则匹配重复行即可:
^(.+?)$(?=.*?^\1$)
fuis
fuis
2024-02-28 11:06:18 +08:00
一行脚本可解

```
[ $(cat 1.txt | wc -l) = $(cat 1.txt | awk -F, '{print $1}' | sort -n | uniq | wc -l) ]; echo $?
```
beyondstars
beyondstars
2024-02-28 11:15:23 +08:00
可以用 trie tree (也叫前缀树)来实现,将文本文件打开为一个 stream, 把这个 stream pipe 到一个 trie tree 型对象里面,每一个 insert 之后返回对应节点的指针,然后检查该节点的 count 是否大于 1.
beyondstars
beyondstars
2024-02-28 11:22:12 +08:00
伪代码如下:

let trieTree = new TrieTree();
let lineStream = openStream("data.txt");
while lineStream is not EOF:
let line = lineStream.getLine();
let field1Value = split(line)[0];
let lastNode = trieTree.insert(field1Value);
if (lastNode.count > 1)
print("Repeated.")
return
beyondstars
beyondstars
2024-02-28 11:24:01 +08:00
不过 trieTree 的 insert 操作一般接受的是一个 path ,你把 string 转换成 char[] 再 insert 到 trieTree ,这样 string 也可以看作是 path 。
wangtian2020
wangtian2020
2024-02-28 11:39:06 +08:00
如果不爆内存,我的做法是

nodejs 读取文件为字符串
换行符/t 分隔字符串为数组
数据把 id map 出来
对数组进行 [...new Set] 变换
判断变换前后 length 是否一致
ffw5b7
ffw5b7
2024-02-28 11:44:06 +08:00
类似分库分表怎么排序查询 top10 一样处理
Tiking
Tiking
2024-02-28 11:49:56 +08:00
老实交代,前几天的上亿裤子,你是不是下完了
nuII
2024-02-28 14:41:29 +08:00
@NESeeker 脱裤,就是数据库
sud0day
2024-02-28 15:19:26 +08:00
@Jirajine 加一,我一听描述感觉就是 TG 上的社工库
sankooc
2024-02-28 15:34:34 +08:00
准确率要求高么 不高的话可以考虑 HLL
FaiChou
2024-02-28 15:49:48 +08:00
@beyondstars #31 我想到的也是 Trie 数据结构

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1018916

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX