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

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

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

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

最好是 java 实现的
5075 次点击
所在节点    程序员
49 条回复
GeruzoniAnsasu
2024-02-27 19:33:10 +08:00
你们 java 八股不是很喜欢考 hashmap 来着
Rickkkkkkk
2024-02-27 19:34:26 +08:00
@GeruzoniAnsasu 八股文考的一般是内存里存不下, 比如文件是 1T 大小
HojiOShi
2024-02-27 19:45:00 +08:00
要检查一个包含重复数据的文本文件中的数据是否重复,你可以按照以下步骤进行:

使用 BufferedReader 和文件流读取文件内容。
将每行内容分割为字段,这里使用你提供的自定义分隔符 | 作为字段间分隔符。
使用哈希表(或 HashSet )来存储每个字段的值。
遍历每个字段的值,如果已经在哈希表中存在该值,则说明数据重复,否则将该值添加到哈希表中。
检查哈希表的大小,如果大小大于预期 Repeat Count ,则说明数据存在重复。
下面是一个 Java 示例代码,你可以根据自己的需求进行修改:

import java.io.*;
import java.util.HashMap;
import java.util.Map;

public class CheckDuplicateData {
public static void main(String[] args) throws IOException {
String fileName = "data.txt"; // 文件名
String delimiter = "|"; // 自定义分隔符
int repeatCount = 2; // 预期的重复次数

Map<String, Integer> countMap = new HashMap<>(); // 统计每个字段的值出现的次数

try (BufferedReader br = new BufferedReader(new FileReader(fileName))) {
String line;
while ((line = br.readLine()) != null) {
String[] fields = line.split(delimiter); // 分割每行为字段
for (String field : fields) {
if (!countMap.containsKey(field)) {
countMap.put(field, 0);
}
countMap.put(field, countMap.get(field) + 1);
}
if (countMap.size() > repeatCount) {
System.out.println("数据存在重复");
break;
}
}
}
}
}

在上面的示例代码中,我们使用了 HashMap 来统计每个字段的值出现的次数。在遍历文件内容时,对于每个字段,我们首先检查是否已经存在于哈希表中,如果不存在,则将其添加到哈希表中并记录计数;如果已经存在于哈希表中,则将计数加一。最后,检查哈希表的大小是否大于预期重复次数,如果是,则输出提示信息并退出循环。
mubai
2024-02-27 19:50:44 +08:00
遍历大 txt 并按照 id 取模拆分成多个小 txt ,读取小 txt 在内存中判断重复。
zihuyishi
2024-02-27 19:58:38 +08:00
印象中这种问题是分组吧,按照首字母或者什么方式 hash 一下分成 n 个小文件,然后再小文件内依次检查是否有重复的
maoyikun
2024-02-27 20:00:37 +08:00
Java 的 NIO 随机读取文件 RandomAccessFile 应该可以满足需求
Jirajine
2024-02-27 20:11:01 +08:00
用 txt 存储大体量的数据是很少见的场景,只在一些传播的裤子中见到过。
正常来说需要对这种数据进行清洗分析之前最好先导入到正经的数据库里。
tutudou
2024-02-27 20:30:24 +08:00
这个我写过类似的,是大文本分割,无论文本多大不经过内存,通过文件指针的方式直接分割文本。你这个要看具体是多大了,看把所有 ID 加入到内存能不能放的下,如果能放得下直接排序不就得了简单省事。如果放不下,考虑要不炫技使用文件指针的骚方式解决。要不把所有数据存入数据库,把 ID 设为唯一且不重复。
yuruizhe
2024-02-27 21:41:02 +08:00
@Rickkkkkkk 如果 id 是整数,用一个布尔数组呗,1T 比特内存,切成若干分页文件
icedx
2024-02-27 21:52:51 +08:00
前年用 rust 写过一个, 卖了 2K XD
NESeeker
2024-02-28 01:13:19 +08:00
裤子?
xarthur
2024-02-28 01:34:37 +08:00
既然是大文件,首先第一个问题就是多大……
levelworm
2024-02-28 03:10:48 +08:00
数据库行吗?
nutting
2024-02-28 08:41:58 +08:00
这是需要完美解决的算法题还是一般实际工程问题?
netnr
2024-02-28 08:57:10 +08:00
布隆过滤器

如果结果不准确,增强或多个 Hash 计算
dode
2024-02-28 09:06:57 +08:00
先用 HashSet 存看看,不够再说
miniliuke
2024-02-28 09:07:59 +08:00
直接布个 spark 集群,文件大就加机器......
gitdoit
2024-02-28 09:13:36 +08:00
简单点 用 SQLite
silencil
2024-02-28 09:22:01 +08:00
这没说到底多大的文件啊,简单点 map 计数都行,实在大的离谱不得搭个大数据框架 mapreduce 下:) doge
bookerlevit
2024-02-28 09:27:19 +08:00
有一个软件叫“大数据去重复工具”,可以去重复,而且超大文件也可以,他是分段去去重复,最后再整合的。

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

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

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

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

© 2021 V2EX