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

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

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

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

最好是 java 实现的
5171 次点击
所在节点    程序员
49 条回复
hemingwang0902
2024-02-28 16:17:54 +08:00
@HojiOShi chatGPT 用得很溜
xxiu
2024-02-28 16:45:04 +08:00
id 如果是数字的话,使用位来表示,1G 可以表示 8589934592 个位置。 只需要一个循环。
xiaohundun
2024-02-28 16:58:43 +08:00
我比较好奇楼上提到的分段去重怎么做到呢
一段内不重复不代表整个文件不重复,请教下
chtcrack
2024-02-28 17:04:51 +08:00
在 Java 中,检查一个大文本文件中数据是否重复可以通过多种方法实现。以下是一种简单的实现方式:
读取文件中的每一行。
解析每行数据,提取出 id 字段。
将提取出的 id 存储到某种数据结构中,例如 HashSet ,以快速检查重复。
遍历文件,同时检查新读取的 id 是否已经在数据结构中。
以下是一个简单的 Java 代码示例,演示了如何实现这一功能:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashSet;

public class CheckDuplicate {
public static void main(String[] args) {
String filePath = "path/to/your/file.txt"; // 替换为你的文件路径
String separator = "|"; // 数据字段之间的分隔符

HashSet<String> ids = new HashSet<>();
boolean hasDuplicates = false;

try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
String line;
while ((line = br.readLine()) != null) {
String[] fields = line.split(separator);
String id = fields[0]; // 假设 id 在第一个字段

if (ids.contains(id)) {
System.out.println("Duplicate ID found: " + id);
hasDuplicates = true;
} else {
ids.add(id);
}
}
} catch (IOException e) {
e.printStackTrace();
}

if (!hasDuplicates) {
System.out.println("No duplicates found.");
}
}
}
在这个代码示例中,我们使用了 HashSet 来存储所有唯一的 id ,因为 HashSet 提供了 O(1)的时间复杂度来检查一个元素是否存在于集合中。这使得检查重复变得非常高效。
请注意,这个代码示例没有进行详细的错误处理,实际应用中可能需要添加更多的异常处理和资源管理代码。此外,根据您的文件大小和内存限制,可能需要考虑使用更高效的数据结构或读取文件的部分内容以避免内存溢出。
tyrone2333
2024-02-28 17:05:11 +08:00
@guanzhangzhang #22 2K 金额 XD 笑
Akiya
2024-02-29 10:55:14 +08:00
没爆内存就 set 存,爆内存就放数据库查
lslqtz
2024-02-29 18:17:42 +08:00
实现一个 func, 以一定的 buffer 顺序读文件, buffer 长度要大于最长匹配词长度的 2 倍, 做匹配, 若匹配到存 offset 或直接返回 bool.
lslqtz
2024-02-29 18:19:42 +08:00
哦, 我以为是匹配给定 keyword 呢, 匹配规律的小数据的话也可以从头读到尾提出来匹配.
Rorysky
2024-02-29 23:14:33 +08:00
sort *.txt | uniq -d

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

https://yangjunhui.monster/t/1018916

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

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

© 2021 V2EX