【发布时间】:2022-12-14 07:11:48
【问题描述】:
我有一个超过 2.5 亿行的文本文件。每行都有一个 3 位数的区号,后跟一个逗号和一个 7 位数的号码。
示例输入文件:
201,2220000
201,5551212
310,5552481
376,1239876
443,0002222
572,8880099
...
我想生成一个输出文件,其中列出每个唯一的区号和该区号的出现次数(仅查看每行的前 3 个字符)。
示例输出(区号、计数):
201, 44556
202、34529
...
我在 Windows 10 环境中工作。
经过大量研究,我能够在 PowerShell 中使用 regex 的 Switch 函数来实现非常接近的效果。这个解决方案的问题是我需要知道我正在寻找哪些区号(而且我不知道这个文件中列出的所有区号)。
我想修改解决方案,使其找到所有唯一的区号,然后运行代码。
这是我尝试过的:
- 说,我要搜索以下四个区号:201,202,203,205
- 我的文本文件是 datafile.txt
$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此代码生成文件 summary.txt 并将计数附加到区号。但是,我认为这是低效的,因为:
- 我需要知道这个数据文件中的所有区号。
- 我必须为每个额外的区号添加 3 行代码。
感谢任何改进此代码或使用替代解决方案的帮助(我在 Stackoverflow 上发现了一个使用 grep https://stackoverflow.com/questions/61229157/using-regex-in-grep-for-windows-command-line 的线程,但它具有相同的限制 - 您需要知道要搜索的字符串。
【问题讨论】:
-
您能否从这 250,000,000 行中提供大约 10 行的样本?
-
太好了,将其编辑到您的问题中
-
刚刚将其添加到问题中。
-
Import-Csv .\Input.txt -Header area |Group-Object -Property area -NoElement |Export-Csv .\Output.csv
标签: regex regex windows powershell grep switch-statement