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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:18:07