中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 如何筛选文本文件中符合字符数要求的行?
« [1] [2] »
作者:
标题: 如何筛选文本文件中符合字符数要求的行? 上一主题 | 下一主题
jtyuer
初级用户





积分 73
发帖 29
注册 2006-8-13
状态 离线
『楼 主』:  如何筛选文本文件中符合字符数要求的行?

有一个文本文件,有N行,每一行字符数3、4、5、6、……不等,要求筛选出字符数为4的行,如何做到?
希望各位老大赐教,谢谢!

2006-8-14 19:49
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


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

  请问你的文本中每行的字符有什么规律吗?比如说,是纯字母?纯数字?数字+字母?有无空格?……

  如果方便的话,贴一段文本出来,再详细解释一下。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-8-14 20:08
查看资料  发短消息 网志   编辑帖子  回复  引用回复
jtyuer
初级用户





积分 73
发帖 29
注册 2006-8-13
状态 离线
『第 3 楼』:  

感谢老大关心,以下是文本文件的内容,都是字母,没有空格,请老大研究一下
ACEC
ACES
ASUC
ASUS
BENC
BENS
boot
COMC
COMS
DELC
DELS
DOS
FOUC
FOUS
FUJC
FUJS
HEDC
HEDS
HPPC
HPPS
IBMC
IBMS
LEGC
LEGS
LENC
LENS
SAMC
SAMS
SIEC
SIES
SONC
SONS
TCLC
TCLS
TONC
TONS
TOSC
TOSS
VAIC
VAIS
VOLC
VOLS
WinXP

2006-8-14 20:50
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 4 楼』:  

Well,利用findstr /x以及正则表达式,问题可以变得很简单:
@echo off
setlocal ENABLEDELAYEDEXPANSION
    set var=%2
    if "%var%" == "" set /p var=输入要显示的行的字符数:
    for /l %%i in (1,1,%var%) do set str=!str!.
    findstr /x %str% %1
    pause>nul
参数1:文本文件名
参数2:要显示的行的字符数(可省)
例如要打印a.txt中的字符数为4的行:
print.bat a.txt 4
或者直接把要处理的文件拖放到脚本文件上,然后按提示操作。

   此帖被 +8 点积分        点击查看详情   
评分人:【 26933062 分数: +8  时间:2007-8-15 02:08


2006-8-14 21:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


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

  我也拼凑了一段代码出来,比3742668版主的稍显罗嗦。
@echo off
:: 显示只有4个字符的文本行
:: test.txt中只有纯字母,无空格,无空行
for /f %%i in (test.txt) do (
    set str=%%i
    set var=%%i
    call :loop
    set num=0
)
pause
goto :eof

:loop
set var=%var:~0,-1%&& set /a num+=1
if not "%var%"=="" goto loop
if %num% equ 4 echo %str%




尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-8-15 01:05
查看资料  发短消息 网志   编辑帖子  回复  引用回复
jtyuer
初级用户





积分 73
发帖 29
注册 2006-8-13
状态 离线
『第 6 楼』:  

谢谢两位老大的帮助,试了一下,两个都通过了,不过还是3742668的简练、运行效率高一些

2006-8-15 14:22
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


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

  我的那段代码是把所有的字符都拉出来一个一个地解析,无论该行字符是否超过4个,是全文解析,所以效率上不去;而3742668版主的代码只打印完全匹配的行,会跳过很多内容,所以效率高得多。
  令我感到有些难以理解的是:3742668版主的for /l %%i in (1,1,%var%) do set str=!str!.这一句,为什么最后要有一个.号呢?str之前并没有赋值,指代的又是什么呢?



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-8-15 15:31
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bagpipe
银牌会员

DOS联盟捡破烂的


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

WELL,那我也就来一个吧,一句就足够了
findstr /x "^[a-zA-Z][a-zA-Z][a-zA-Z][a-zA-Z]$" test.txt

2006-8-15 15:50
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
bagpipe
银牌会员

DOS联盟捡破烂的


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

其实3742668版主的搜索正是用到了正则表达式.的作用
findstr /x  .... test.txt 试试,呵呵,是一样的效果,只不过3742668版主在这里只是为了通用性,比如搜索5个6个字符或者更多,可以随时改变

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

batch fan


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

  bagpipe又开始出精简代码了,厉害厉害。三段代码,只有我的又长又低效,看来还得潜水。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-8-15 21:52
查看资料  发短消息 网志   编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 11 楼』:  



  Quote:
三段代码,只有我的又长又低效,看来还得潜水。

不同的方法自然代码不同,相对来说你的代码在扩展性上还是有一定的优势的。其实一开始看到标题,首先想到的方法就是和你一样的方法,考虑到效率方面的问题,然后又有了下面的代码:
@echo off
setlocal ENABLEDELAYEDEXPANSION
for /f "delims=" %%i in (test.txt) do (
    set str=b%%ie
    if not "!str:~5,1!" == "" if "!str:~6,1!" == "" echo. %%i
)
pause
goto :eof
然后再进一步地考虑效率以及容错方面的提升,最终还是选择了findstr /x ....的方法,然后稍微对功能进行了一点扩展,最后就形成了4F的代码。

2006-8-16 00:02
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
mornsmile
初级用户




积分 147
发帖 23
注册 2005-1-23
状态 离线
『第 12 楼』:  

看到楼上的签名才发现
%windir%\Help\ntcmds.chm这个宝

2006-8-16 07:15
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


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

  11楼的代码通过插入字符的方式来判断,并且适合于行中带空格的情况,高,实在是高。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-8-16 10:18
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bd123456789
中级用户





积分 360
发帖 216
注册 2007-5-29
状态 离线
『第 14 楼』:  



  Quote:
Originally posted by 3742668 at 2006-8-14 09:56 PM:
Well,利用findstr /x以及正则表达式,问题可以变得很简单:
[code]
@echo off
setlocal ENABLEDELAYEDEXPANSION
    set var=%2
    if "%var%" == "" set /p var=输 ...

我怎么看不懂四楼的代码
有谁能讲一下吗???

2007-7-6 16:49
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bjsh
银牌会员





积分 2000
发帖 621
注册 2007-1-1
状态 离线
『第 15 楼』:  

findstr "^....$" test.txt 不就行了

2007-7-6 22:22
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: