使用PowerShell从40000份邮件文本提取8/9位档案编号
嘿,我来帮你搞定这个PowerShell脚本的完善工作!针对你提到的从4万份邮件txt里提取8/9位档案编号的需求,我们可以用正则表达式精准匹配各种带分隔符的格式,同时做好后续的清洗和去重处理。
核心思路
首先明确:你的档案编号本质是8位或9位数字,中间可能夹杂单个空格或短横线(位置不固定)。我们需要做两件事:
- 精准匹配这些带分隔符的编号,避免误抓其他数字串
- 提取后统一格式(去掉分隔符),并去重避免重复记录
完整PowerShell实现
1. 单文件处理脚本
如果你的邮件都存在单个大txt文件里,用这个脚本:
# 替换成你的邮件文件路径 $sourceFilePath = "C:\MailArchives\all-emails.txt" # 替换成提取结果的保存路径 $outputFilePath = "C:\Extracted\archive-numbers.txt" # 读取整个文件内容(大文件也能高效处理) $emailContent = Get-Content -Path $sourceFilePath -Raw # 正则表达式:匹配8/9位数字,中间允许单个空格或短横线,确保是独立编号 $archivePattern = '\b(?:\d[ -]?){7}\d\b|\b(?:\d[ -]?){8}\d\b' # 提取所有匹配项 $rawMatches = [regex]::Matches($emailContent, $archivePattern) # 清洗编号:去掉分隔符,验证长度,去重 $cleanedNumbers = $rawMatches.Value | ForEach-Object { $cleanNum = $_ -replace '[ -]', '' # 二次验证确保是8或9位纯数字 if ($cleanNum.Length -in 8,9 -and $cleanNum -match '^\d+$') { $cleanNum } } | Select-Object -Unique # 保存结果到文件 $cleanedNumbers | Out-File -Path $outputFilePath -Encoding UTF8 Write-Host "✅ 处理完成!共提取到 $($cleanedNumbers.Count) 个唯一档案编号,已保存到 $outputFilePath"
2. 多文件批量处理脚本
如果你的4万份邮件是分散在多个txt文件里,用这个批量处理版本:
# 替换成存放邮件txt的文件夹路径 $sourceFolder = "C:\MailArchives\IndividualEmails" $outputFilePath = "C:\Extracted\archive-numbers.txt" # 正则表达式:匹配8/9位数字,中间允许单个空格或短横线,确保是独立编号 $archivePattern = '\b(?:\d[ -]?){7}\d\b|\b(?:\d[ -]?){8}\d\b' # 初始化存储所有匹配项的数组 $allRawMatches = @() # 遍历所有txt文件 Get-ChildItem -Path $sourceFolder -Filter "*.txt" -Recurse | ForEach-Object { Write-Host "正在处理文件:$($_.Name)" $content = Get-Content -Path $_.FullName -Raw $matches = [regex]::Matches($content, $archivePattern) $allRawMatches += $matches.Value } # 清洗和去重逻辑和单文件一致 $cleanedNumbers = $allRawMatches | ForEach-Object { $cleanNum = $_ -replace '[ -]', '' if ($cleanNum.Length -in 8,9 -and $cleanNum -match '^\d+$') { $cleanNum } } | Select-Object -Unique $cleanedNumbers | Out-File -Path $outputFilePath -Encoding UTF8 Write-Host "✅ 批量处理完成!共提取到 $($cleanedNumbers.Count) 个唯一档案编号"
关键细节说明
- 正则表达式解释:
\b:单词边界,确保我们匹配的是独立的编号(不会从更长的数字串里截取,比如避免从1234567890里抓前9位)(?:\d[ -]?){7}\d:匹配8位数字,每两个数字之间可选单个空格/短横线(?:\d[ -]?){8}\d:匹配9位数字,逻辑同上|:表示“或”,同时匹配8位和9位的情况
- 二次验证:提取后再检查长度和是否纯数字,避免因为特殊字符或格式异常导致的误匹配
- 去重处理:用
Select-Object -Unique确保最终结果里没有重复的编号
测试建议
先找一小部分包含各种编号格式的邮件内容做测试,比如创建一个测试txt:
测试内容: 9位编号示例:123 45 6789、123-45-6789、123456789 8位编号示例:12 345 678、12-345-678、12345678 要排除的内容:1234567(7位)、1234567890(10位)、abc123456(含字母)
运行脚本后,应该只提取到123456789和12345678两个唯一编号,验证逻辑是否正确。
如果你的编号还有其他特殊分隔符(比如点号·或下划线_),只需要修改正则里的分隔符部分,比如把[ -]改成[ -._]即可。
内容的提问来源于stack exchange,提问作者Jared Knott
相关产品推荐
相关产品推荐

