如何统计文本文件中的重复行数?现有VB去重代码未生效
统计文本文件重复行数的VB实现方案
原代码问题分析
你的代码存在几个关键问题导致去重失败,同时无法实现重复行数统计:
String.Join("", sFiles)会把多个文件路径直接拼接成无效路径(比如C:\file1.txtC:\file2.txt),导致StreamReader无法读取文件- 多余的
Close()调用,Using块会自动释放StreamReader/StreamWriter资源,手动调用会引发错误 - HashSet仅实现了去重,但没有记录每行的重复次数,无法统计重复行数
统计重复行数的实现代码
下面是可以统计重复行数并可选移除重复行的VB代码:
Private Sub CountAndRemoveDuplicates(sender As Object, e As EventArgs) ' 获取目标目录下的所有文件 Dim sFiles() As String = Directory.GetFiles(filesPath1, remove_dupl) For Each filePath As String In sFiles ' 用Dictionary记录每行的出现次数,Key是行内容,Value是出现次数 Dim lineCountDict As New Dictionary(Of String, Integer)() Dim totalLines As Integer = 0 ' 读取文件并统计每行次数 Using sr As New StreamReader(filePath) Dim line As String Do While sr.Peek() >= 0 line = sr.ReadLine() totalLines += 1 If lineCountDict.ContainsKey(line) Then lineCountDict(line) += 1 Else lineCountDict(line) = 1 End If Loop End Using ' 计算重复行数:总行数减去唯一行数 Dim duplicateLinesCount As Integer = totalLines - lineCountDict.Count MessageBox.Show($"文件 {Path.GetFileName(filePath)} 总行数:{totalLines}{vbCrLf}重复行数:{duplicateLinesCount}") ' 可选:移除重复行并写入原文件 Using sw As New StreamWriter(filePath) For Each lineEntry In lineCountDict.Keys sw.WriteLine(lineEntry) Next End Using Next End Sub
代码说明
- 遍历目录下的每个文件,避免多文件路径拼接错误
- 使用
Dictionary(Of String, Integer)精准记录每行的出现次数 - 重复行数计算逻辑:总行数 - 唯一行数,也可以遍历字典累加
次数-1的和(结果一致) - 保留了去重写入的功能,可根据需求注释掉这部分
- 用
Path.GetFileName(filePath)获取文件名,提升提示信息可读性
内容的提问来源于stack exchange,提问作者Fiínek Cahů
相关产品推荐
相关产品推荐

