修改BAT批处理脚本 将VCF提取数据整理为Excel可导入格式
批处理实现方案
纯Windows自带批处理即可实现两种输出需求,不需要安装额外工具,直接替换原有脚本内容就能运行。
方案1:同字段值合并为逗号分隔单行
完全匹配你最初预期的输出格式,修正了字段含特殊字符时识别错误的问题,代码如下:
@Echo off setlocal enabledelayedexpansion cd /d %~dp0 :: 合并所有vcf文件 copy /B *.vcf master_list.txt >nul :: 定义要提取的字段列表,用|分隔,不要修改分隔符 set "fields=FN|TITLE|ORG|EMAIL;|TEL;TYPE=WORK:" :: 清空结果文件 type nul > results.txt :: 遍历每个字段,提取值后合并为逗号分隔行 :parse_field for /f "tokens=1* delims=|" %%a in ("%fields%") do ( set "cur_field=%%a" set "fields=%%b" set "line=!cur_field!:" for /f "delims=" %%v in ('findstr /C:"!cur_field!:" master_list.txt 2^>nul') do ( set "val=%%v" :: 去掉字段前缀,只保留值部分 set "val=!val:*: =!" set "line=!line! !val!," ) :: 去掉末尾多余逗号写入结果 if defined line echo !line:~0,-1! >> results.txt ) if defined fields goto parse_field pause
运行后生成的results.txt就会是同字段所有值用逗号分隔的单行格式。
方案2:转置为标准表格格式(可直接用Excel打开)
你需要的「字段为列头、单条名片占一行」的格式本质是标准CSV格式,直接双击就能用Excel打开,不会出现错位问题。注意:你原来把所有同字段结果直接堆在一起的写法会丢失「字段属于哪张名片」的对应关系,必须按VCARD名片块逐段提取才能保证数据匹配正确,实现代码如下:
@Echo off setlocal enabledelayedexpansion cd /d %~dp0 :: 合并所有vcf文件 copy /B *.vcf master_list.txt >nul :: 初始化列配置 set "field_cnt=0" set "header=" :: 配置表格列:格式为 call :add_col "VCF内字段前缀" "表格显示列头名",按需要增删即可 call :add_col "FN" "FN" call :add_col "TITLE" "Title" call :add_col "ORG" "Org" call :add_col "EMAIL;" "Email" call :add_col "TEL;TYPE=WORK:" "Work Tel" :: 写入CSV表头 echo !header! > contacts.csv :: 初始化单张名片的字段值存储 for /l %%i in (1,1,!field_cnt!) do set "v_%%i=" set "invcard=0" :: 逐行遍历合并后的vcf文件,按单个名片块提取字段 for /f "delims=" %%l in (master_list.txt) do ( set "line=%%l" :: 识别名片块开始,重置存储变量 if "!line!"=="BEGIN:VCARD" ( set "invcard=1" for /l %%i in (1,1,!field_cnt!) do set "v_%%i=" ) :: 识别名片块结束,将当前名片所有字段拼成一行写入CSV if "!line!"=="END:VCARD" ( set "invcard=0" set "row=" for /l %%i in (1,1,!field_cnt!) do ( set "row=!row!"!v_%%i!"," ) :: 去掉末尾多余逗号写入行 echo !row:~0,-1! >> contacts.csv ) :: 名片块内匹配对应字段存值 if !invcard! equ 1 ( for /l %%i in (1,1,!field_cnt!) do ( echo !line! | findstr /C:"!f_%%i!" >nul && ( set "val=!line!" set "val=!val:*: =!" :: 转义值内自带的引号、逗号,避免CSV格式错乱 set "v_%%i=!val:"=""!" ) ) ) ) :: 清理临时文件 del master_list.txt echo 处理完成,结果已保存为contacts.csv,可直接用Excel打开 pause goto :eof :add_col set /a field_cnt+=1 set "f_!field_cnt!=%~1" set "header=!header!"%~2"," goto :eof
使用说明
- 输出文件为
contacts.csv,已经对值内自带逗号、引号的特殊情况做了转义,Excel打开不会出现列错位 - 需要增减提取字段时,只需要在代码
call :add_col的位置按示例格式加行即可,第一个参数填VCF文件里的字段前缀,第二个参数填你想要的表格列头名 - 脚本自动按
BEGIN:VCARD/END:VCARD拆分单张名片,不会出现不同人的信息错配问题
内容的提问来源于stack exchange,提问作者DylanC
相关产品推荐
相关产品推荐

