中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 求助!文本格式的文件中寻找某行的某个字符....
作者:
标题: 求助!文本格式的文件中寻找某行的某个字符.... 上一主题 | 下一主题
liuxuehui
新手上路





积分 18
发帖 5
注册 2006-6-30
状态 离线
『楼 主』:  求助!文本格式的文件中寻找某行的某个字符....

公司经常有大批量同类型的文件需要整理出来.
情况如下:
     现有1000个文本文件(是测试数据),其内容中有一个标识符(在文件的第五行有一个字母"P"或者是一个"F",用来标记是测试"Pass"还是"Fail"的.但内容的其它行有相同的字母.只有第五行只有一个字母"P"or"F").我想从这1000个文件中挑选出标有"PASS"的机(第五行是"P"字母).并把它们复制到某个文件夹."FAIL"放另一个文件夹.

2006-7-1 01:08
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 2 楼』:  

  如果这1000个文本文件位于同一目录D:\test下,且该目录只有这1000个文本文件,并且文件名中,除了后缀名外,再没有其他的点号,我想,这个问题可以分两步解决:

  第一步:先把这些文件的文件名提出来,按照一行一个文件名的格式存放在另外目录的list.txt文件中;
  第二步:用for命令解析list.txt中的文件,用find命令搜索字母p或者f,如果发现p,将文件放到d:\test1中;如果发现了f(也就是没有发现p),则把文件放到d:\test2中。

  通过以上的分析,可以产生如下代码:
@echo off
dir /a /b d:\test>d:\list.txt
md d:\test1 d:\test2>nul 2>nul
for /f "delims=." %%i in (list.txt) do (
    find /i "p" "d:\test\%%i.txt">nul 2>nul && (
        copy "d:\test\%%i.txt" d:\test1>nul 2>nul
    ) || (
        copy "d:\test\%%i.txt" d:\test2>nul 2>nul
    )
)
del /q d:\list.txt
pause
  另:楼主给出的环境还不够具体,所以在写这段代码的时候,我自行加上了很多限制条件。如果有更具体的环境的话,写代码就有针对性一些;

2006-7-1 09:06
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bagpipe
银牌会员

DOS联盟捡破烂的


积分 1144
发帖 425
注册 2005-10-20
来自 北京
状态 离线
『第 3 楼』:  

把这个批处理放到你要整理的那个1000个文本文件的文件夹下,会自动产生F和P这两个文件夹,当然了,各自就是你的PASS 和 FAIL了

@echo off
md .\P&md .\F
for %%a in (*.txt) do (
for /f "tokens=2 delims=:" %%i in ('"findstr /n .* %%a|findstr "5""') do (
if /i "%%i"=="P" (copy "%%a" .\P) else if /i "%%i"=="F" copy "%%a" .\F
)
)

2006-7-1 10:16
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 4 楼』:  

  sorry,看了bagpipe的代码之后,才发现2楼的代码漏掉了“第五行”这个条件,2楼的代码作废,请楼主用3楼bagpipe的代码吧。

  bagpipe真厉害,写的代码非常简洁,专业人士就是不一样啊。

2006-7-1 10:29
查看资料  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 5 楼』:  

  for中用了通配符*,可以轻松地匹配所有的文本文件,比用dir命令列文件名的做法简洁得多,而且不会产生临时文件,再次对bagpipe的代码表示赞叹。

2006-7-1 10:32
查看资料  发短消息 网志   编辑帖子  回复  引用回复
liuxuehui
新手上路





积分 18
发帖 5
注册 2006-6-30
状态 离线
『第 6 楼』:  

非常感谢各位,由于工作忙没有来看发表的求助,在此向各位说声SORRY!本人为了这件事而看了一个星期的批处理,就是没有摸透其中的奥妙,以后多向各位学习.看到@
我要好好分析分析这几个文件,不懂再问兄弟们!"我菜我怕谁呀!".......顶......

2006-7-6 01:39
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
liuxuehui
新手上路





积分 18
发帖 5
注册 2006-6-30
状态 离线
『第 7 楼』:  风笛!这一句能详细说说吗?

for /f "tokens=2 delims=:" %%i in ('"findstr /n .* %%a|findstr "5""')

2006-7-6 06:09
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bagpipe
银牌会员

DOS联盟捡破烂的


积分 1144
发帖 425
注册 2005-10-20
来自 北京
状态 离线
『第 8 楼』:  

好的,简单解释一下

findstr /n .* %%a|findstr "5"这句代码的主要作用就是把文件的第5行单提出出来,其他过滤掉,包括空行,用.*来显示每行,并且用/n表明每行的行号,这样显示出的效果就是    5:F

然后用FOR语句提取F,之所以delims=:就是用:号做为分隔符,然后取第二个变量也就是正好把tokens设置成等于2


OK??????????????

2006-7-7 09:22
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
dosfroum
初级用户





积分 154
发帖 54
注册 2005-9-25
状态 离线
『第 9 楼』:  

這個東西我有問過 請參考我的話題
http://www.cn-dos.net/forum/view ... ge=1&highlight=

2006-7-8 11:59
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
buddiyar
初级用户





积分 160
发帖 75
注册 2006-6-28
状态 离线
『第 10 楼』:  

做个记号 好象用得着啊
哈哈

2006-7-13 21:17
查看资料  发送邮件  发短消息 网志  OICQ (243589543)  编辑帖子  回复  引用回复
pclxxxh
新手上路





积分 9
发帖 4
注册 2008-9-26
状态 离线
『第 11 楼』:  高人大作,留个记号

简洁精练,值得学习,留着研究用

2008-9-28 00:29
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: