Board logo

标题: [文本处理] 在大型文本中搜索包含多个"完整字"的行 [打印本页]

作者: qzwqzw    时间: 2009-6-16 18:21     标题: 在大型文本中搜索包含多个"完整字"的行

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

[ 本帖最后由 qzwqzw 于 2009-6-16 19:57 编辑 ]
作者: namejm    时间: 2009-6-16 18:27

  那么大的文件,findstr处理起来够吃力的,还是用sed之类的第三方命令行工具吧,要是文本较小,并且指定非得用findstr不可的话,我的第一反应就是 findstr /i "a" test.txt|findstr "1"|findstr /i "b" ,不过这个方案也够低效的。
作者: qzwqzw    时间: 2009-6-16 18:32

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

findstr /i "a" a.txt>b.txt
findstr /i "b" b.txt>c.txt
findstr "1" c.txt>d.txt
感觉这样应该不会很慢吧?创建临时文件比用管道快多了。
作者: 随风    时间: 2009-6-16 19:12

来个雷人的 (^_^)
findstr /i ".*a.*1.*b.* .*a.*b.*1.* .*b.*1.*a.* .*b.*a.*1.* .*1.*a.*b.* .*1.*b.*a.*" a.txt
作者: qzwqzw    时间: 2009-6-16 19:51

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

5楼的代码刚开始想过
但只是匹配"字符"
不是匹配"字"的
这样会把
a1b
acc 123 bcd
这样的行搜到
作者: namejm    时间: 2009-6-16 20:05

  findstr支持的正则太有限了,要是能像sed之流那么强悍的话,恐怕批处理就更能吸引人了,唉,findstr是批处理的一大痛。
作者: 随风    时间: 2009-6-16 20:44     标题: 回复 6楼 的帖子

findstr 遍历文本的速度是快的惊人的,我测试a.txt  大小67M 只需数秒。
另外:
如果
a1b
acc 123 bcd
都不是需要匹配的行,那么需要匹配的是什么呢?有点糊涂了~
作者: Batcher    时间: 2009-6-16 21:08     标题: 回复 8楼 的帖子

a、1 、b左右两边都有空格
作者: qzwqzw    时间: 2009-6-17 08:09

做了折中处理

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

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

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




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