Board logo

标题: 出题:按特定条件查找文本内容(新手进) [打印本页]

作者: 26933062     时间: 2008-5-24 01:20    标题: 出题:按特定条件查找文本内容(新手进)
a.txt 内容
sdfgsdfgsdfg
上正确
abcddfja;正确
下正确
sdfgsdgs
sdfgsdgsdg
55555555555
上正确
abcd正确
下正确
fgfdgsdfg
77777777777
上正确
abcddkfja
下正确
tuytutyuy
gfhgfh
上正确
abcd正确
下正确
要求一:显示a.txt中以 abcd 开头的行和它的上一行。 要求二:显示a.txt中以 abcd 开头的行和它的上一行及下一行。 为方便验证,在abcd开头的行的上下行分别以上正确、和下正确标明,所以不能以这些内容为判断基准。即:只能以是否 abcd 开头来判断 ... [ Last edited by 26933062 on 2008-5-24 at 01:46 AM ]

作者: pusofalse     时间: 2008-5-24 01:32
一句完成?

作者: 26933062     时间: 2008-5-24 01:34
Originally posted by pusofalse at 2008-5-24 01:32: 一句完成?
两个要求,两个代码, 一句肯定不能完成啊。。。

作者: bat-zw     时间: 2008-5-24 02:04    标题: 呵呵,还是我先来抛个石头吧:
第二题就留给大家了,第一题如下(为开拓一下思路):
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (a.txt) do (
    set str=%%i&set /a n+=1
    set _!n!=%%i
    if "!str:~,4!"=="abcd" call :lp 
)
pause>nul&goto :eof
:lp
set b=%n%&set /a a=b-1
echo !_%a%!&echo !_%b%!
[ Last edited by zw19750516 on 2008-5-24 at 02:05 AM ]

作者: pusofalse     时间: 2008-5-24 02:10
1
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in (a.txt) do (
	set/a n+=1
	set !n!=%%a
)
for /l %%a in (1 1 %n%) do if "!%%a:~0,4!" equ "abcd" call :lp %%a

pause&goto :eof


:lp
set/a x=%1-1
echo !%x%!
echo !%1!
2.
@echo off&setlocal enabledelayedexpansion
for /f "delims=:" %%a in ('findstr /n .* a.txt') do set end=%%a
for /f "delims=" %%a in (a.txt) do (
	set/a n+=1
	set !n!=%%a
)
for /l %%a in (1 1 %n%) do if "!%%a:~0,4!" equ "abcd" call :lp %%a

pause&goto :eof


:lp
set/a x=%1-1
set/a m=%1+1
echo !%x%!
echo !%1!
if %m% lss %end% echo !%m%!

作者: 26933062     时间: 2008-5-24 02:14    标题: 5 楼
虽达到效果,但代码不够简洁,不够效率,加2分鼓励!继续努力,争取在一个for里完成。

作者: pusofalse     时间: 2008-5-24 02:18
Originally posted by 26933062 at 2008-5-24 02:14 AM: 虽达到效果,但代码不够简洁,不够效率,加2分鼓励!继续努力,争取在一个for里完成。
谢谢鼓励。。。 完全彼此误解了啊,我问是不是一句完成,是问是不是在一句for中完成。。。 而你理解的貌似是两个问题,两段代码 - -|||||| 谢谢。。。

作者: bat-zw     时间: 2008-5-24 02:23    标题: 我再来抛:
第二题其实只要稍改下我前面的代码就可以了:
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (a.txt) do (
    set str=%%i&set /a n+=1
    set _!n!=%%i
    if "!str:~,4!"=="abcd" call :lp 
)
pause>nul&goto :eof
:lp
if defined c echo !_%c%!
set b=%n%
set /a a=b-1,c=b+1
echo !_%a%!&echo !_%b%!
ps:我也是新手,加分不,呵呵。 [ Last edited by zw19750516 on 2008-5-24 at 02:25 AM ]

作者: 26933062     时间: 2008-5-24 02:26
利用 set /a n+=1 来记录每一行,不失为一个办法,但似乎还可以更简洁。 也许谈不上更简洁,但还有其它办法,支持一题多解。。继续。。

作者: 26933062     时间: 2008-5-24 02:27    标题: 回 8 楼
你还是新手啊? 老鸟了。。。

作者: pusofalse     时间: 2008-5-24 02:31
Originally posted by zw19750516 at 2008-5-24 02:23 AM: 第二题其实只要稍改下我前面的代码就可以了: [code] @echo off&setlocal enabledelayedexpansion for /f "delims=" %%i in (a.txt) do ( set str=%%i&set /a n+ ...
厉害~~~

作者: 26933062     时间: 2008-5-24 02:33    标题: 回 8 楼
稀里糊涂就给你加分了,你的代码结果不正确。。。

作者: bat-zw     时间: 2008-5-24 02:34
还想到个利用for /l %%i in 。。。 的,我就不再写了,留给pusofalse兄弟多多思考了。

作者: bat-zw     时间: 2008-5-24 02:36
Originally posted by 26933062 at 2008-5-24 02:33: 稀里糊涂就给你加分了,你的代码结果不正确。。。
怎么不正确了,晕。。。 运行结果:
sdfjafj2上
abcddfja;
dfaf下
asdfj;af7上
abcd
dsfajfa下
ajdfa9djf上
abcddkfja
adfie下
djf;3a上
abcd未行
[ Last edited by zw19750516 on 2008-5-24 at 02:40 AM ]

作者: 26933062     时间: 2008-5-24 02:37
Originally posted by zw19750516 at 2008-5-24 02:36: 怎么不正确了,晕。。。
最后一行没有显示出来。

作者: bat-zw     时间: 2008-5-24 02:41
Originally posted by 26933062 at 2008-5-24 02:37: 最后一行没有显示出来。
abcd不是最后一行?

作者: 26933062     时间: 2008-5-24 02:50
看我的样本,最后一行是 “下正确”

作者: terse     时间: 2008-5-24 03:00
报到

作者: bat-zw     时间: 2008-5-24 03:01    标题: 这样可以不:
加个abcd是不是倒数第二行判断:
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (b.txt) do (
    set str=%%i&set /a n+=1
    set _!n!=%%i
    if "!str:~,4!"=="abcd" call :lp 
)
set /a m=n-1
set str=!_%m%!
if "!str:~,4!"=="abcd" echo !_%n%!
pause>nul&goto :eof
:lp
if defined c echo !_%c%!
set b=%n%
set /a a=b-1,c=b+1
echo !_%a%!&echo !_%b%!

作者: 26933062     时间: 2008-5-24 03:07
还要考虑 简洁和效率

作者: terse     时间: 2008-5-24 10:20
发一个 这样处理行不 @echo off&setlocal enabledelayedexpansion for /f "delims=" %%i in (a.txt) do ( set str=%%i if "!str:~,4!"=="abcd" echo !var!&echo %%i set var=%%i ) pause 我也要分 @echo off&setlocal enabledelayedexpansion for /f "delims=" %%i in (a.txt) do ( if defined str1 echo !str1!&echo !var!&echo %%i&set str1= set str=%%i if "!str:~,4!"=="abcd" set str1=!var! set var=%%i ) pause [ Last edited by terse on 2008-5-24 at 10:33 AM ]

作者: bat-zw     时间: 2008-5-24 11:16    标题: 这下可以了吧:
昨晚思路卡住了:
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (b.txt) do (
    set /a n+=1
    set _!n!=%%i
    if !n! geq 3 call :lp
)
pause>nul&goto :eof
:lp
set c=%n%
set /a b=c-1,a=c-2
set str=!_%b%!
if "!str:~,4!"=="abcd" echo !_%a%!&echo !_%b%!&echo !_%c%!
[ Last edited by zw19750516 on 2008-5-24 at 11:18 AM ]

作者: bat-zw     时间: 2008-5-24 11:26
Originally posted by terse at 2008-5-24 10:20: 发一个 这样处理行不 @echo off&setlocal enabledelayedexpansion for /f "delims=" %%i in (a.txt) do ( set str=%%i if "!str:~,4!"=="abcd" echo !var!& ...
高。。。