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

Windows10下统计海量文本唯一区号出现次数的优化方案求助

问题描述

我有一个超过2.5亿行的文本文件,每行格式是3位区号,7位数字,示例如下:

201,2220000
201,5551212
310,5552481
...

需要生成输出文件,列出每个唯一区号的出现次数,格式为「区号, 次数」。

目前在Windows 10环境用PowerShell的Switch函数结合正则实现,但存在两个问题:

  1. 必须预先知道所有区号
  2. 新增区号要添加多行代码,扩展性差

现有代码如下:

$count1 = 0
$count2 = 0
$count3 = 0
$count4 = 0
switch -File C:\datafile.txt -Exact -Regex { '201\S{8}' { ++$count1 } }
Write-Output "Area Code 201: $($count1)" | Format-Table | Out-File "C:\summary.txt" -append
switch -File C:\datafile.txt -Exact -Regex { '202\S{8}' { ++$count2 } }
Write-Output "Area Code 202: $($count2)" | Format-Table | Out-File "C:\summary.txt" -append
switch -File C:\datafile.txt -Exact -Regex { '203\S{8}' { ++$count3 } }
Write-Output "Area Code 203: $($count3)" | Format-Table | Out-File "C:\summary.txt" -append
switch -File C:\datafile.txt -Exact -Regex { '205\S{8}' { ++$count4 } }
Write-Output "Area Code 204: $($count4)" | Format-Table | Out-File "C:\summary.txt" -append

试过grep方案,但同样需要预先指定搜索字符串,求优化方法或替代方案。

优化方案

方案1:PowerShell哈希表统计(一次遍历,性能最优)

用哈希表存储区号计数,仅遍历文件一次,自动识别所有区号,完全解决原代码的痛点:

# 初始化哈希表用于存储区号计数
$areaCodeCounts = @{}

# 一次遍历整个文件,提取每行前3位作为区号并更新计数
switch -File C:\datafile.txt {
    default {
        $areaCode = $_.Substring(0, 3)
        # 存在则计数+1,不存在则初始化为1
        $areaCodeCounts[$areaCode] = ($areaCodeCounts[$areaCode] ?? 0) + 1
    }
}

# 将结果按要求格式输出到文件
$areaCodeCounts.GetEnumerator() | ForEach-Object {
    "$($_.Key), $($_.Value)"
} | Out-File "C:\summary.txt" -Encoding utf8

核心优势:

  • 仅需一次遍历文件,原代码需遍历N次(N为区号数量),2.5亿行场景下性能提升量级明显
  • 自动识别所有存在的区号,无需预先知晓
  • 代码逻辑固定,新增/减少区号完全不需要修改代码

方案2:PowerShell Group-Object(代码更简洁)

如果系统内存足够(可通过-ReadCount参数控制内存占用),可以用更简洁的分组命令实现:

# 每次读取1万行,降低内存压力
Get-Content C:\datafile.txt -ReadCount 10000 | ForEach-Object {
    $_ | ForEach-Object { $_.Substring(0, 3) }
} | Group-Object -NoElement | ForEach-Object {
    "$($_.Name), $($_.Count)"
} | Out-File "C:\summary.txt" -Encoding utf8

说明:

  • -ReadCount 10000表示批量读取1万行后处理,避免一次性加载2.5亿行到内存
  • Group-Object -NoElement直接返回分组后的区号和对应计数

方案3:Windows版Gawk(极致文本处理性能)

如果追求最高处理效率,可安装Windows版Gawk(比如通过Chocolatey执行choco install gawk安装),然后运行:

gawk -F ',' '{count[$1]++} END {for (code in count) print code ", " count[code]}' C:\datafile.txt > C:\summary.txt

优势:

  • Gawk是专门的高性能文本处理工具,处理超大规模文件的速度优于PowerShell
  • 代码极简,自动识别所有区号,无需提前配置

内容的提问来源于stack exchange,提问作者Matteru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 15:20:36