[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] (已解决)批处理: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

谢谢!!
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

回复 1# 非常感谢

所谓批处理并不是处理一个单一的例子,你的题干都没有描述清楚要解决的问题或者说对象的规律,文本的内容除了那些还有其他么?
Still with wax

TOP

我也不知道记事本可以打开不
  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
复制代码

TOP

来个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
复制代码
1

评分人数

看得多说得多,远比不上写得多。

TOP

回复 5# weichenxiehou

导出的c.vcf是空的。

TOP

本帖最后由 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
看得多说得多,远比不上写得多。

TOP

回复 8# weichenxiehou

我是在桌面上新建了一个文件夹,在里面放了a.txt,b.vcf,还有您给的代码批处理了一下,不要笑话我哦,gawk.exe怎么做?

TOP

回复 10# 非常感谢
gawk.exe不是做的,是要下的,下载下来放到那个目录或%path%包含的任一目录即可。
看得多说得多,远比不上写得多。

TOP

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

TOP

回复 9# 非常感谢
文件小可以批处理处理(不确定你的文件最多有多大)
文件大的话 还是用GAWK吧

TOP

  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
复制代码
1

评分人数

TOP

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

TOP

返回列表