标题: 求教:如何显示一个文本内的随机行?
[打印本页]
作者: theoldman
时间: 2007-2-3 02:59
标题: 求教:如何显示一个文本内的随机行?
求教:如何显示一个文本内的随机行? 请DX赐教~~
ps:本人刚开始学习p处理,以后还请DX们多多指教T_T
作者: qjbm
时间: 2007-2-3 03:29
@ECHO %DBG% OFF
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "TOKENS=*" %%i IN (TEST.TXT) DO (SET /A h+=1 & SET r!h!=%%i)
SET /A s=%RANDOM%%%%h%+1
ECHO !r%s%!
作者: ccwan
时间: 2007-2-3 03:40
to qjbm
兄的思路不错,但是代码无法处理空行,建议ECHO !r%s%!换成ECHO. !r%s%!
作者: qjbm
时间: 2007-2-3 04:02
ccwan
FOR /F 对文本中的空行是跳过处理的.
!r%s%!不会为空.
[
Last edited by qjbm on 2007-2-2 at 03:04 PM ]
作者: ccwan
时间: 2007-2-3 04:10
re qjbm
看来兄没有测试,你的代码在处理空行时会出错,显示“关闭 echo”之类的信息。
你可以找一篇文档在里面输入空行试一下就会明白了。
作者: namejm
时间: 2007-2-3 04:10
2楼的代码确实不错,但是,除了3楼所说的问题,还会存在一些缺陷:
1、因为使用了变量延迟语句,会把文本中的感叹号忽略;
2、普通的for语句会忽略以分号打头的行;
3、"tokens=*" 会忽略行首的所有空格;
4、如果行数巨大,那么,SET r!h!=%%i 会导致变量过多而出错;
换用一种思路,可以避免如上缺陷:
@echo off
:: 为了能显示特殊字符,echo语句加上了引号
for /f "tokens=1 delims=:" %%i in ('findstr /n .* test.txt') do set lines=%%i
set /a rnd=%random%%%%lines%
for /f "delims= eol=" %%i in ('more +%rnd% test.txt') do echo "%%i"&pause&exit
类似的问题曾经有过讨论,请看精华帖:
一个关于随机获取文件名的问题.
[
Last edited by namejm on 2007-2-2 at 03:13 PM ]
作者: ccwan
时间: 2007-2-3 04:19
jm的代码很精简了,思路居然和我一样。^_^
只是我用的是bagpipe帖子中的more /e <test.txt ,不如版主的代码简练。
作者: qjbm
时间: 2007-2-3 04:29
ccwan 兄麻烦测试下.
是不是我的测试方法不对??还是有什么别的问题,
我测试的时候就没有你说的情况.
TEST.TXT
fd saf dsa f
fds afd saf
fd s afs
fdsaf dsaf
fdsa fdsalkjf
fd saf dsafb
ewq sdfgfgga
[
Last edited by qjbm on 2007-2-2 at 03:31 PM ]
作者: namejm
时间: 2007-2-3 04:33
qjbm 的 for 语句确实会跳过空行,也就是说,没有处理空行,所以,echo 语句无须换为 echo. 语句。
作者: qjbm
时间: 2007-2-3 04:36
2楼代码确实存在6楼所述1.2.3.4项问题.
特殊字符是批处理的一块心病.
[
Last edited by qjbm on 2007-2-2 at 03:39 PM ]
作者: ccwan
时间: 2007-2-3 04:38
re qjbm
请试试下面的内容
test.txt
最美的十大精典爱情句子
1) I love you not because of who you are, but because of who I am when I am with you.
我爱你,不是因为你是一个怎样的人,而是因为我喜欢与你在一起时的感觉。
2) No man or woman is worth your tears, and the one who is, won't make you cry.
没有人值得你流泪,值得让你这么做的人不会让你哭泣。
3) The worst way to miss someone is to be sitting right beside them knowing you can't have them.
失去某人,最糟糕的莫过于,他近在身旁,却犹如远在天边。
4) Never frown, even when you are sad, because you never know who is falling in love with your smile.
纵然伤心,也不要愁眉不展,因为你不知是谁会爱上你的笑容。
5) To the world you may be one person, but to one person you may be the world.
对于世界而言,你是一个人;但是对于某个人,你是他的整个世界。
6) Don‘t waste your time on a man/woman, who isn't willing to waste their time on you.
不要为那些不愿在你身上花费时间的人而浪费你的时间。
7) Just because someone doesn't love you the way you want them to, doesn't mean they don't love you with all they have.
爱你的人如果没有按你所希望的方式来爱你,那并不代表他们没有全心全意地爱你。
8) Don't try so hard, the best things come when you least expect them to.
不要着急,最好的总会在最不经意的时候出现。
9) Maybe God wants us to meet a few wrong people before meeting the right one, so that when we finally meet the person, we will know how to be grateful.
在遇到梦中人之前,上天也许会安排我们先遇到别的人;在我们终于遇见心仪的人时,便应当心存感激。
10) Don't cry because it is over, smile because it happened.
不要因为结束而哭泣,微笑吧,为你的曾经拥有。
在这段内容里没有特殊符号,只有空行。我就是拿它测试的。
作者: qjbm
时间: 2007-2-3 04:40
三人行,必有吾师
兄提供的测试文本中,从第3行开始,有的空行是有4个空格符,问题正出在这里.
2楼的代码确实有问题.
[
Last edited by qjbm on 2007-2-2 at 03:49 PM ]
作者: ccwan
时间: 2007-2-3 04:51
确实如此,我一直当作是空行的,呵呵。也就是说,兄的代码真正不能处理的是特殊字符。
但我又有一个疑问,空行不能算作是文本中的某一行吗?
[
Last edited by ccwan on 2007-2-3 at 04:55 AM ]
作者: namejm
时间: 2007-2-3 04:55
ccwan在11楼贴出来的文本看上去虽然每行都是以空行分隔,但是,实际情况并非如此,如果使用全选功能的话,就会发现 1) 到 4) 之间的空白部分存在特殊字符,从而导致echo语句报错,去掉这些特殊字符之后一切正常。
——————————————
原来楼上两位已经发现了问题的所在,我的帖子就重复了。
[
Last edited by namejm on 2007-2-2 at 03:57 PM ]
作者: ccwan
时间: 2007-2-3 04:57
13楼提出疑问,空行应该也是文本中的某一行,那么是否应该把它也作为随机行显示?
作者: namejm
时间: 2007-2-3 04:59
6楼的代码可以实现这个功能,只不过是以引号来表示空行的。如果要显示真正的空行的话,echo语句加个判断就行了。
作者: theoldman
时间: 2007-2-3 05:44
楼上各位真热心^_^
逐楼学习中!!
作者: theoldman
时间: 2007-2-3 05:53
关于2楼的代码由于水平有限实在看的不是很明白,谁能否帮忙解释一下呢?
@ECHO %DBG% OFF
SETLOCAL ENABLEDELAYEDEXPANSION--这句具体的作用是什么呢?帮助里说的很晦涩,实在看的不是很明白
FOR /F "TOKENS=*--这里用*是什么作用呢--" %%i IN (TEST.TXT) DO (SET /A h+=1 & SET r!h!=%%i)--r!h!是什么意思呢?--
SET /A s=%RANDOM%%%%h%+1--这句的%很多,没分明白:(也请仔细解释一下--
ECHO !r%s%!
[
Last edited by theoldman on 2007-2-2 at 05:19 PM ]
作者: theoldman
时间: 2007-2-3 06:11
在论坛搜索了一下
FOR /F "TOKENS=*--这里用*是什么作用呢--" 这个是查找所有列吧?此处如果不用这个参数可以么?
作者: anqing
时间: 2007-2-3 12:36
@ECHO %DBG% OFF
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "TOKENS=*" %%i IN (TEST.TXT) DO (SET /A h+=1 & SET r!h!=%%i)
SET /A s=%RANDOM%%%%h%+1
ECHO !r%s%!
这个p中,加r的意思是什么呀?
SET /A s=%RANDOM%%%%h%+1这一行看着点晕、??
[
Last edited by anqing on 2007-2-3 at 12:39 PM ]
作者: jmz573515
时间: 2007-2-10 00:51
灌水
randomize
set fso=createobject("scripting.filesystemobject")
set a=createobject("scripting.dictionary")
set file=fso.opentextfile("a.txt")
do while file.atendofstream<>true
m=m+1
a.add m,file.readline
loop
file.close
h=int(rnd*m)
msgbox "第" & h & "行: " & a(h) ,4096,"随机内容"