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

[文本处理] 把很多文本中的指定内容输出到另一文本

我用手机的电话本备份工具备份了电话本,共有100多个.备份后的文件格式是VCF.用记事本打开后内容如下:
  1. BEGIN:VCARD
  2. VERSION:2.1
  3. N;CHARSET=UTF-8:张三
  4. TEL;CELL:13888888888
  5. END:VCARD
复制代码

其中
N;CHARSET=UTF-8:张三
冒号后面的是人名
TEL;CELL:13888888888
冒号后面的是电话号码

问题如下:
利用批处理将每个VCF文件中的人名和电话号码以下面的格式输出到TXT文件
  1. 人名:电话号码
  2. 人名:电话号码
  3. 人名:电话号码
  4. ......
复制代码


请指教!!!
帮助别人是快乐
被人帮助是幸福

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%t in ('dir /a-d /b *.vcf') do (
  4.   set txt=%%t
  5.   for /f "tokens=2 delims=:" %%i in ('type !txt!^|find /i "CHARSET"') do (set name=%%i)
  6.   for /f "tokens=2 delims=:" %%j in ('type !txt!^|find /i "TEL"') do (set tel=%%j)
  7.   echo 正在保存 !name! 的电话...
  8.   >>telbook.ini echo !name!: !tel!
  9. )
  10. pause
复制代码

TOP

  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in ('dir/b *.vcf') do (
  3. set "f="
  4. call :w "%%~a"
  5. echo !name!:!tel!>>Result.txt
  6. )
  7. goto:eof
  8. :w
  9. for /f "usebackq skip=2 tokens=2 delims=:" %%z in ("%~1") do (
  10. if not defined f (set "name=%%z"&set f=1) else (set "tel=%%z"&goto :eof)
  11. )
复制代码

TOP

哎,一个FOR就能把人名和电话提取出来,我怎么就想不到呢。

TOP

还可以简单点:

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in ('dir /s /a-d /b *.vcf') do (
  3.      for /f "usebackq delims=" %%i in ("%%a") do (
  4.           set /a n+=1
  5.           if !n! gtr 2 if !n! lss 5 set "str=%%i"&set "str=!str:*:=!&set "var=!var!:!str!"
  6.       )
  7.      echo !var:~,-1!>>telbook.txt&set /a n=0&set "var="
  8. )
  9. start telbook.txt
复制代码

[ 本帖最后由 batman 于 2008-12-14 10:19 编辑 ]
***共同提高***

TOP

  1. @echo off
  2. for %%A in (*.VCF) do (
  3.   for /f "usebackq skip=2 eol=E delims=: tokens=2" %%a in ("%%A") do (
  4.     if %%a geq a (set /p=%%a:<nul>>Tel.txt) else echo %%a>>Tel.txt
  5.   )
  6. )
复制代码

[ 本帖最后由 tireless 于 2008-12-14 13:22 编辑 ]
4

评分人数

TOP

回复 7楼 的帖子

说不定这群人在CSDN的各个开发版块都是大牛人呢,只是在这里用了另一个ID而已,嘿嘿。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

谢谢各位的帮助.我因为这几天有点事情,所以才回帖!抱歉!!
回复大家:
出现了一个错误:
通过运行上面各位的代码后,提取的人名都是乱码,好象是因为格式的问题!!!!!
其中:
itrui  的代码运行较慢!!!
rat    的代码能达到目的
batman 的代码有点问题,输出的文件里每一行都是~,-1
tireless 的代码能达到目的,也正如各位评分时所说的!!

但是现在唯一的问题就是输出的姓名都是乱码,号码正常...各位师傅能不能再帮忙研究一下..
怎么才能输出正常的汉字呢?
下面有附件...我认为能用记事本打开....读取正常...但是和记事本的编码不同
帮助别人是快乐
被人帮助是幸福

TOP

回复 9楼 的帖子

那些是UTF-8编码格式
你应该在顶楼把这一点说清楚
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

原帖由 tireless 于 2008-12-14 10:39 发表
@echo off
for %%A in (*.VCF) do (
  for /f "usebackq skip=2 eol=E delims=: tokens=2" %%a in ("%%A") do (
    if %%a geq a (set /p=%%a:>Tel.txt) else echo %%a>>Tel.txt
  )
)

我想请教一下 if %%a geq a (set /p=%%a:>Tel.txt) else echo %%a>>Tel.txt 这一段的应该怎么理解。

tokens=2取的是第二段的内容,也就是包括了姓名跟电话号码,为什么只用一个参数就能把这两个内容以 姓名:电话 的形式表现出来呢?希望版主能帮我详细分析一下这段代码的意思~谢谢

TOP

饿 学习中。。看不懂哦 惨
收入分四种:狂劳不得,多劳少得,少劳多得,不劳狂得。还好,我是第二种!

TOP

回复 11楼 的帖子

你把@echo off删除,看看那个if ... else ...是怎样执行的,就明白了。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 9楼 的帖子

先用 ConCmd.exe 转换文件编码:
  1. ConCmd.exe /o:gbk *.vcf
复制代码
可以生成到新文件:
  1. ConCmd.exe /o:gbk *.vcf  *.txt
复制代码

TOP

原帖由 Batcher 于 2008-12-29 15:56 发表
你把@echo off删除,看看那个if ... else ...是怎样执行的,就明白了。


我去掉了@echo off 运行如下

C:\>for %A in (*.VCF) do (for /F "usebackq skip=2 eol=E delims=: tokens=2" %a in
("%A") do (if %a GEQ a (set /p=%a: 0<nul 1>>Tel.txt )  else echo %a 1>>Tel.txt
) )

C:\>(for /F "usebackq skip=2 eol=E delims=: tokens=2" %a in ("1.vcf") do (if %a
GEQ a (set /p=%a: 0<nul 1>>Tel.txt )  else echo %a 1>>Tel.txt ) )

C:\>(if 张三 GEQ a (set /p=张三: 0<nul 1>>Tel.txt )  else echo 张三 1>>Tel.txt )

C:\>(if 13888675 GEQ a (set /p=13888675: 0<nul 1>>Tel.txt )  else echo 13888675
1>>Tel.txt )

C:\>pause
请按任意键继续. . .

里面我还是有一个问题没有弄懂,if %a% geq a 里面的 a 是指的什么?再就是 set /p=张三: 0<nul 1>>Tel.txt 中的0和1是指的什么,在原来的代码里面并没有出现0和1,但是在运行的时候就出现了?我看了if的教程,但是只有ERRORLEVEL 里面有0跟1这个说法,不知道是不是我没有理解if命令,麻烦版主在指点一下。

TOP

1、
if %a% geq a 里面的 a 是指的什么?

是在比较 ASCII 值。大小关系是:

数字 < 英文 < 中文

比较的时候是一位一位地比较。例如 ag 会大于 abzzzzzzzz。

所以,if %a% geq a (...) else (...) 就可以分出是电话号码还是人名。

2、
set /p=张三: 0<nul 1>>Tel.txt 中的0和1是指的什么

参考:
重定向中的秘密
重定向中的秘密(续)
Using command redirection operators

TOP

返回列表