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

[文本处理] 在大型文本中搜索包含多个"完整字"的行

手头有一个比较大型的文本
大约40M大小
每行由数个字母、数字和空格组成
如: ab 3 b 31 a c1 17 1
要求用findstr找出同时包含a 1 b 这三个“完整的字”的行
字出现顺序不固定,需要都能find到

[ 本帖最后由 qzwqzw 于 2009-6-16 19:57 编辑 ]

做了折中处理

将待搜索文本做了一次性处理
其中的单个空格替换成双空格
行首与行尾也添加了空格
行内字按字符排序
整个文本按行排序
然后模式串就可以这样重新构造
" 1 .* a .* b "

不过效率仍然是个问题
待搜索文本有五十万行的规模
findstr 一次大约需要7~8秒
而模式文本有上万行
时间效率可想而知

所以我还在想精简模式串的办法
想办法能从上万行模式串找出规律
比如这些模式串有很多相似的特征
a .* 1 .* b
a .* 1 .* c
a .* 2 .* b
独立的筛选会做很多无用功

TOP

回复 8楼 的帖子

a、1 、b左右两边都有空格
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 6楼 的帖子

findstr 遍历文本的速度是快的惊人的,我测试a.txt  大小67M 只需数秒。
另外:
如果
a1b
acc 123 bcd
都不是需要匹配的行,那么需要匹配的是什么呢?有点糊涂了~
技术问题请到论坛发帖求助!

TOP

  findstr支持的正则太有限了,要是能像sed之流那么强悍的话,恐怕批处理就更能吸引人了,唉,findstr是批处理的一大痛。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

不知道对40M文本findstr上万次
2楼和4楼又将次数乘以三
还是不试了

5楼的代码刚开始想过
但只是匹配"字符"
不是匹配"字"的
这样会把
a1b
acc 123 bcd
这样的行搜到

TOP

来个雷人的 (^_^)
findstr /i ".*a.*1.*b.* .*a.*b.*1.* .*b.*1.*a.* .*b.*a.*1.* .*1.*a.*b.* .*1.*b.*a.*" a.txt
技术问题请到论坛发帖求助!

TOP

findstr /i "a" a.txt>b.txt
findstr /i "b" b.txt>c.txt
findstr "1" c.txt>d.txt
感觉这样应该不会很慢吧?创建临时文件比用管道快多了。
技术问题请到论坛发帖求助!

TOP

效率是个大问题
环境所限不能用第三方
另外 a 1 b 这个模式串不是一个固定串
而是从另外一个数K的文本中按行取的
所以感觉利用findstr /G最高效
很想利用正则构造这个模式串
但是发现麻烦挺大
不知道谁有好的注意?

TOP

  那么大的文件,findstr处理起来够吃力的,还是用sed之类的第三方命令行工具吧,要是文本较小,并且指定非得用findstr不可的话,我的第一反应就是 findstr /i "a" test.txt|findstr "1"|findstr /i "b" ,不过这个方案也够低效的。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

返回列表