You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计文本文件中的重复行数?现有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ů

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 02:20:36