Board logo

标题: [文本处理] (已解决)批处理:vcf格式 ---- 只保留有效号码? [打印本页]

作者: 非常感谢    时间: 2013-9-10 12:53     标题: (已解决)批处理:vcf格式 ---- 只保留有效号码?

本帖最后由 非常感谢 于 2013-9-11 13:27 编辑

批处理前:
a.txt里的内容
2013年9月10日 +861111111111 00:00:00
2013年9月10日 +862222222222 00:00:00
2013年9月10日 +863333333333 00:00:00
合计无效号码数:3个
合计有效号码数:2个

b.vcf内容里有---有对应的上面三个号码
BEGIN:VCARD
VERSION:3.0
N:tianshanyuehua
X-SKYPE-USERNAME:tianshan
TZ:08:00
EMAIL:donghai@outlook.com
X-SKYPE-PROFILE:1
REV:01130911T004132Z
END:VCARD

BEGIN:VCARD
VERSION:3.0
N:+865555555555
X-SKYPE-PSTNNUMBER:+865555555555
REV:01130911T004134Z
END:VCARD

BEGIN:VCARD
VERSION:3.0
N:+864444444444
X-SKYPE-PSTNNUMBER:+864444444444
REV:01130911T004134Z
END:VCARD

BEGIN:VCARD
VERSION:3.0
N:+863333333333
X-SKYPE-PSTNNUMBER:+863333333333
REV:01130911T004134Z
END:VCARD

BEGIN:VCARD
VERSION:3.0
N:+86111111111
X-SKYPE-PSTNNUMBER:+86111111111
REV:01130911T004134Z
END:VCARD

BEGIN:VCARD
VERSION:3.0
N:+862222222222
X-SKYPE-PSTNNUMBER:+862222222222
REV:01130911T004134Z
END:VCARD

批处理后得出,c.vcf文件。就是下面样子。

BEGIN:VCARD
VERSION:3.0
N:tianshanyuehua
X-SKYPE-USERNAME:tianshan
TZ:08:00
EMAIL:donghai@outlook.com
X-SKYPE-PROFILE:1
REV:01130911T004132Z
END:VCARD

BEGIN:VCARD
VERSION:3.0
N:+865555555555
X-SKYPE-PSTNNUMBER:+865555555555
REV:01130911T004134Z
END:VCARD

BEGIN:VCARD
VERSION:3.0
N:+864444444444
X-SKYPE-PSTNNUMBER:+864444444444
REV:01130911T004134Z
END:VCARD
打算把a.txt和b.vcf放一个文件夹里面,不改文件名,批处理后得出文件为:c.vcf

谢谢!!
作者: Lumiere    时间: 2013-9-10 16:17

回复 1# 非常感谢

所谓批处理并不是处理一个单一的例子,你的题干都没有描述清楚要解决的问题或者说对象的规律,文本的内容除了那些还有其他么?
作者: terse    时间: 2013-9-10 20:30

我也不知道记事本可以打开不
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "tokens=2" %%i in (a.txt) do echo %%i)>c.vcf
  3. findstr /ivg:c.vcf b.vcf >$
  4. (for /f "tokens=*" %%i in ($) do (
  5. if /i "%%i" == "END:VCARD" if /i "!s!" neq "BEGIN:VCARD" (
  6. for %%j in ("!s1!" "!s!" "%%i") do echo;%%~j
  7. echo;
  8. )
  9. set s1=!s!
  10. set s=%%i
  11. ))>c.vcf
  12. del $
  13. pause
复制代码

作者: weichenxiehou    时间: 2013-9-10 20:38

来个gawk吧,略显复杂。
  1. gawk "BEGIN{while(getline<\"a.txt\">0)arr[$2]=1;RS=\"\";FS=\"\n\"}!(substr($2,index($2,\":\")+1) in arr){print $0 \"\n\"}" b.vcf>c.vcf
复制代码

作者: 非常感谢    时间: 2013-9-10 21:39

回复 5# weichenxiehou

导出的c.vcf是空的。
作者: weichenxiehou    时间: 2013-9-10 21:43

本帖最后由 weichenxiehou 于 2013-9-10 21:45 编辑

回复 6# 非常感谢
不知你的vcf格式文件是否为文本类型的文件,还有,你确定你的可用路径下有gawk.exe吗?我的测试结果:
e:\test>gawk "BEGIN{while(getline<\"a.txt\">0)arr[$2]=1;RS=\"\";FS=\"\n\"}!(subs
tr($2,index($2,\":\")+1) in arr){print $0 \"\n\"}" b.vcf>c.vcf

e:\test>type c.vcf
BEGIN:VCARD
X-SKYPE-PSTNNUMBER:+864444444444
END:VCARD

BEGIN:VCARD
X-SKYPE-PSTNNUMBER:+865555555555
END:VCARD
作者: 非常感谢    时间: 2013-9-10 22:23

回复 8# weichenxiehou

我是在桌面上新建了一个文件夹,在里面放了a.txt,b.vcf,还有您给的代码批处理了一下,不要笑话我哦,gawk.exe怎么做?
作者: weichenxiehou    时间: 2013-9-10 22:28

回复 10# 非常感谢
gawk.exe不是做的,是要下的,下载下来放到那个目录或%path%包含的任一目录即可。
作者: 非常感谢    时间: 2013-9-11 08:53

回复 3# terse
在另外的测试当中出了点状况,主题从新编辑了一下,希望terse有时间的时候帮忙看一下,谢谢~~~!!!
作者: terse    时间: 2013-9-11 11:07

回复 9# 非常感谢
文件小可以批处理处理(不确定你的文件最多有多大)
文件大的话 还是用GAWK吧
作者: terse    时间: 2013-9-11 11:24

  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "tokens=2" %%i in (a.txt) do echo :%%i)>#
  3. (for /f "tokens=*" %%i in (b.vcf) do (
  4. if /i "%%i" == "END:VCARD" (
  5. echo !str! "%%i"&set str=
  6. ) else set str=!str! "%%i"
  7. ))>$
  8. (for /f "tokens=*" %%i in ('findstr /ivg:# $ ') do (
  9. for %%j in (%%i) do echo;%%~j
  10. echo;
  11. ))>c.vcf
  12. del # $
  13. pause
复制代码

作者: 非常感谢    时间: 2013-9-11 13:27

回复 11# terse
要处理的文件大概不到10k,,,测试成功,,,谢谢了!!!




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2