中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 求教:如何显示一个文本内的随机行?
« [1] [2] »
作者:
标题: 求教:如何显示一个文本内的随机行? 上一主题 | 下一主题
theoldman
初级用户





积分 39
发帖 16
注册 2007-1-30
状态 离线
『楼 主』:  求教:如何显示一个文本内的随机行?

求教:如何显示一个文本内的随机行? 请DX赐教~~
ps:本人刚开始学习p处理,以后还请DX们多多指教T_T

2007-2-3 02:59
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qjbm
初级用户





积分 125
发帖 44
注册 2007-1-24
状态 离线
『第 2 楼』:  


@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%!


   此帖被 +1 点积分    点击查看详情   
评分人:【 theoldman 分数: +1  时间:2007-2-3 05:48


2007-2-3 03:29
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 3 楼』:  

to qjbm
兄的思路不错,但是代码无法处理空行,建议ECHO !r%s%!换成ECHO. !r%s%!

   此帖被 +1 点积分    点击查看详情   
评分人:【 theoldman 分数: +1  时间:2007-2-3 05:49




三人行,必有吾师焉。   学然后知不足,教然后知困,然后能自强也。
2007-2-3 03:40
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qjbm
初级用户





积分 125
发帖 44
注册 2007-1-24
状态 离线
『第 4 楼』:  

ccwan

FOR /F 对文本中的空行是跳过处理的.

!r%s%!不会为空.

[ Last edited by qjbm on 2007-2-2 at 03:04 PM ]

2007-2-3 04:02
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 5 楼』:  

re qjbm
看来兄没有测试,你的代码在处理空行时会出错,显示“关闭 echo”之类的信息。
你可以找一篇文档在里面输入空行试一下就会明白了。



三人行,必有吾师焉。   学然后知不足,教然后知困,然后能自强也。
2007-2-3 04:10
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


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

  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 ]



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2007-2-3 04:10
查看资料  发短消息 网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 7 楼』:  

jm的代码很精简了,思路居然和我一样。^_^
只是我用的是bagpipe帖子中的more /e <test.txt ,不如版主的代码简练。



三人行,必有吾师焉。   学然后知不足,教然后知困,然后能自强也。
2007-2-3 04:19
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qjbm
初级用户





积分 125
发帖 44
注册 2007-1-24
状态 离线
『第 8 楼』:  

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 ]

2007-2-3 04:29
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


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

  qjbm 的 for 语句确实会跳过空行,也就是说,没有处理空行,所以,echo 语句无须换为 echo. 语句。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2007-2-3 04:33
查看资料  发短消息 网志   编辑帖子  回复  引用回复
qjbm
初级用户





积分 125
发帖 44
注册 2007-1-24
状态 离线
『第 10 楼』:  

2楼代码确实存在6楼所述1.2.3.4项问题.

特殊字符是批处理的一块心病.

[ Last edited by qjbm on 2007-2-2 at 03:39 PM ]

2007-2-3 04:36
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 11 楼』:  

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.

    不要因为结束而哭泣,微笑吧,为你的曾经拥有。
在这段内容里没有特殊符号,只有空行。我就是拿它测试的。



三人行,必有吾师焉。   学然后知不足,教然后知困,然后能自强也。
2007-2-3 04:38
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qjbm
初级用户





积分 125
发帖 44
注册 2007-1-24
状态 离线
『第 12 楼』:  

三人行,必有吾师

兄提供的测试文本中,从第3行开始,有的空行是有4个空格符,问题正出在这里.

2楼的代码确实有问题.

[ Last edited by qjbm on 2007-2-2 at 03:49 PM ]

2007-2-3 04:40
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 13 楼』:  

确实如此,我一直当作是空行的,呵呵。也就是说,兄的代码真正不能处理的是特殊字符。

但我又有一个疑问,空行不能算作是文本中的某一行吗?

[ Last edited by ccwan on 2007-2-3 at 04:55 AM ]



三人行,必有吾师焉。   学然后知不足,教然后知困,然后能自强也。
2007-2-3 04:51
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


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

  ccwan在11楼贴出来的文本看上去虽然每行都是以空行分隔,但是,实际情况并非如此,如果使用全选功能的话,就会发现 1) 到 4) 之间的空白部分存在特殊字符,从而导致echo语句报错,去掉这些特殊字符之后一切正常。
——————————————
  原来楼上两位已经发现了问题的所在,我的帖子就重复了。

[ Last edited by namejm on 2007-2-2 at 03:57 PM ]



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2007-2-3 04:55
查看资料  发短消息 网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 15 楼』:  

13楼提出疑问,空行应该也是文本中的某一行,那么是否应该把它也作为随机行显示?



三人行,必有吾师焉。   学然后知不足,教然后知困,然后能自强也。
2007-2-3 04:57
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: