Board logo

标题: [文本处理] 把很多文本中的指定内容输出到另一文本 [打印本页]

作者: lzwudi    时间: 2008-12-13 23:38     标题: 把很多文本中的指定内容输出到另一文本

我用手机的电话本备份工具备份了电话本,共有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. ......
复制代码


请指教!!!
作者: itrui    时间: 2008-12-14 01:31

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

作者: rat    时间: 2008-12-14 01:39

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

作者: itrui    时间: 2008-12-14 08:12

哎,一个FOR就能把人名和电话提取出来,我怎么就想不到呢。
作者: batman    时间: 2008-12-14 09:50     标题: 还可以简单点:

  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 编辑 ]
作者: tireless    时间: 2008-12-14 10:39

  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 编辑 ]
作者: Batcher    时间: 2008-12-15 19:20     标题: 回复 7楼 的帖子

说不定这群人在CSDN的各个开发版块都是大牛人呢,只是在这里用了另一个ID而已,嘿嘿。
作者: lzwudi    时间: 2008-12-25 22:24

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

但是现在唯一的问题就是输出的姓名都是乱码,号码正常...各位师傅能不能再帮忙研究一下..
怎么才能输出正常的汉字呢?
下面有附件...我认为能用记事本打开....读取正常...但是和记事本的编码不同
作者: Batcher    时间: 2008-12-25 22:32     标题: 回复 9楼 的帖子

那些是UTF-8编码格式
你应该在顶楼把这一点说清楚
作者: zcy85611    时间: 2008-12-29 13:44

原帖由 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取的是第二段的内容,也就是包括了姓名跟电话号码,为什么只用一个参数就能把这两个内容以 姓名:电话 的形式表现出来呢?希望版主能帮我详细分析一下这段代码的意思~谢谢
作者: beck1321    时间: 2008-12-29 13:50

饿 学习中。。看不懂哦 惨
作者: Batcher    时间: 2008-12-29 15:56     标题: 回复 11楼 的帖子

你把@echo off删除,看看那个if ... else ...是怎样执行的,就明白了。
作者: tireless    时间: 2008-12-29 22:08     标题: 回复 9楼 的帖子

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

作者: zcy85611    时间: 2008-12-30 11:20

原帖由 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命令,麻烦版主在指点一下。
作者: tireless    时间: 2008-12-30 12:20

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




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