Board logo

标题: 如何筛选文本文件中符合字符数要求的行? [打印本页]

作者: jtyuer     时间: 2006-8-14 19:49    标题: 如何筛选文本文件中符合字符数要求的行?

有一个文本文件,有N行,每一行字符数3、4、5、6、……不等,要求筛选出字符数为4的行,如何做到?
希望各位老大赐教,谢谢!
作者: namejm     时间: 2006-8-14 20:08
  请问你的文本中每行的字符有什么规律吗?比如说,是纯字母?纯数字?数字+字母?有无空格?……

  如果方便的话,贴一段文本出来,再详细解释一下。
作者: jtyuer     时间: 2006-8-14 20:50
感谢老大关心,以下是文本文件的内容,都是字母,没有空格,请老大研究一下
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
作者: 3742668     时间: 2006-8-14 21:56
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
或者直接把要处理的文件拖放到脚本文件上,然后按提示操作。
作者: namejm     时间: 2006-8-15 01:05
  我也拼凑了一段代码出来,比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%

作者: jtyuer     时间: 2006-8-15 14:22
谢谢两位老大的帮助,试了一下,两个都通过了,不过还是3742668的简练、运行效率高一些
作者: namejm     时间: 2006-8-15 15:31
  我的那段代码是把所有的字符都拉出来一个一个地解析,无论该行字符是否超过4个,是全文解析,所以效率上不去;而3742668版主的代码只打印完全匹配的行,会跳过很多内容,所以效率高得多。
  令我感到有些难以理解的是:3742668版主的for /l %%i in (1,1,%var%) do set str=!str!.这一句,为什么最后要有一个.号呢?str之前并没有赋值,指代的又是什么呢?
作者: bagpipe     时间: 2006-8-15 15:50
WELL,那我也就来一个吧,一句就足够了
findstr /x "^[a-zA-Z][a-zA-Z][a-zA-Z][a-zA-Z]$" test.txt
作者: bagpipe     时间: 2006-8-15 16:24
其实3742668版主的搜索正是用到了正则表达式.的作用
findstr /x  .... test.txt 试试,呵呵,是一样的效果,只不过3742668版主在这里只是为了通用性,比如搜索5个6个字符或者更多,可以随时改变
作者: namejm     时间: 2006-8-15 21:52
  bagpipe又开始出精简代码了,厉害厉害。三段代码,只有我的又长又低效,看来还得潜水。
作者: 3742668     时间: 2006-8-16 00:02


  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的代码。
作者: mornsmile     时间: 2006-8-16 07:15
看到楼上的签名才发现
%windir%\Help\ntcmds.chm这个宝
作者: namejm     时间: 2006-8-16 10:18
  11楼的代码通过插入字符的方式来判断,并且适合于行中带空格的情况,高,实在是高。
作者: bd123456789     时间: 2007-7-6 16:49


  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=输 ...

我怎么看不懂四楼的代码
有谁能讲一下吗???
作者: bjsh     时间: 2007-7-6 22:22
findstr "^....$" test.txt 不就行了
作者: bd123456789     时间: 2007-7-7 08:26    标题: 小于特定字符值得研究!!

如果我要查找小于四个字符的行,那么该怎么办呢?
即找出只有一个字符,或二个字符...
作者: bjsh     时间: 2007-7-7 12:22
re ls:
sed -n "/^.\{1,3\}$/p" test.txt
作者: bd123456789     时间: 2007-7-7 14:28


  Quote:
Originally posted by bjsh at 2007-7-7 12:22 PM:
re ls:
sed -n "/^.\{1,3\}$/p" test.txt

能不能不使用SED

我只作CMD研究

光FINDSTR不行??
作者: ccwan     时间: 2007-7-7 15:01


  Quote:
Originally posted by bd123456789 at 2007-7-7 14:28:



能不能不使用SED

我只作CMD研究

光FINDSTR不行??

可以啊。只要把3742668版主的代码改一下就行。
例如要显示1-3个字符数,代码如下:
@echo off
setlocal ENABLEDELAYEDEXPANSION
for /l %%a in (1 1 2) do (
    for /l %%i in (1,1,%%a) do (
        set str=!str!.
        findstr /x !str! test.txt
    )
)
pause>nul

作者: bd123456789     时间: 2007-7-8 11:47
呵呵
聪明

行!