PowerShell提取VCF字段导出CSV格式不符合预期如何解决
PowerShell解析VCF文件输出横向表格解决方案
问题现状
需要批量提取当前目录下所有vcf联系人文件的指定字段,输出为列对齐的多列表格,期望格式:
FN: ORG: Title Tel: Email: Example A Exam A Exa A EX A EA Example B Exam B Exa B Ex B EB
现有脚本运行后仅能逐行输出匹配到的零散字段,同时存在字段丢失、值匹配错误的问题,实际输出:
FN:Example A ORG:Exam A Title:Exa A Tel: EX A Email: ExA FN: Example B ORG:Exam B Title: Exa A Email: EX B
当前使用的代码:
ls *.vcf|%{cat $_ >>"result.txt"} Get-Content "result.txt" | Select-String -Pattern '(FN:)|(ORG:)|(TITLE:)|(TEL;WORK;VOICE:)|(EMAIL;)'>>new.csv
问题原因
- 脚本仅做了行匹配追加,没有按单个联系人维度分组解析,所有字段零散排列无法形成横向表格
- 正则规则不严谨:
EMAIL;未匹配冒号分隔符,TEL;WORK;VOICE:未做值提取,未处理字段值前后的多余空格 - 无字段缺失兜底逻辑,匹配不到的字段直接丢失
- 多次运行时
>>追加模式会写入历史冗余内容,导致结果错乱
修正脚本
# 初始化联系人结果集 $contactList = @() # 遍历目录下所有vcf文件 Get-ChildItem -Filter *.vcf | ForEach-Object { # 读取单个文件完整内容 $vcfContent = Get-Content $_.FullName -Raw # 预定义所有需要的字段,默认值为空,避免字段缺失 $contact = [PSCustomObject]@{ 'FN:' = '' 'ORG:' = '' 'Title:' = '' 'Tel:' = '' 'Email:' = '' } # 逐字段匹配提取值,自动去除首尾多余空格 if ($vcfContent -match 'FN:(.*?)(\r?\n|$)') { $contact.'FN:' = $matches[1].Trim() } if ($vcfContent -match 'ORG:(.*?)(\r?\n|$)') { $contact.'ORG:' = $matches[1].Trim() } if ($vcfContent -match 'TITLE:(.*?)(\r?\n|$)') { $contact.'Title:' = $matches[1].Trim() } if ($vcfContent -match 'TEL;WORK;VOICE:(.*?)(\r?\n|$)') { $contact.'Tel:' = $matches[1].Trim() } if ($vcfContent -match 'EMAIL;[^:]*:(.*?)(\r?\n|$)') { $contact.'Email:' = $matches[1].Trim() } $contactList += $contact } # 输出自动对齐的文本表格到文件 $contactList | Format-Table -AutoSize | Out-File -FilePath 联系人表格.txt -Encoding UTF8 # 若需要导出为Excel可识别的标准CSV,替换为以下命令即可 # $contactList | Export-Csv -Path 联系人列表.csv -NoTypeInformation -Encoding UTF8
使用说明
- 脚本无需生成临时合并文件,直接逐个解析vcf,避免不同联系人字段混淆
- 预定义字段兜底,匹配不到对应内容时自动留空,不会出现列错位、字段丢失问题
- 正则兼容Windows和Unix风格的换行符,适配不同来源的vcf文件
Format-Table -AutoSize会自动根据内容长度调整列宽,输出和期望格式一致的对齐效果- 导出CSV时使用UTF8编码,避免中文乱码
内容的提问来源于stack exchange,提问作者DylanC
相关产品推荐
相关产品推荐

