找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 34986|回复: 12

[文本处理] [已解决]求助批处理在文本中取随机值

[复制链接]
发表于 2013-5-10 07:28:23 | 显示全部楼层 |阅读模式
本帖最后由 hijackle 于 2013-5-13 14:19 编辑

有一段文本,内容如下:

singer=张信哲,张宇,韩红,陈奕迅,......(歌手名称很多,都是以,分割的)
song=回来,放不下心,盛夏的果实,........(歌曲名也很多,也都是以,分割的)


歌手名和歌曲名的数量都是不确定的,如何快速的随机获取一个歌手名和歌曲名,不要求歌手和歌曲对应的,就随机获取就可以,最好不要生成临时文件

高手帮忙


追问一下,如果文本中含有特殊符号&和=怎么办,比如文本如下:

singer=张信哲,张宇,韩红,陈奕迅,陈羽凡&胡海泉=羽泉,......(歌手名称很多,都是以,分割的)
song=回来,放不下心,盛夏的果实,........(歌曲名也很多,也都是以,分割的)


最后一次追问一下,如果文本中含有特殊符号&和=和?怎么办,(其他符号比如_和-应该不会对代码有影响的吧),比如文本如下:

singer=张信哲,张宇,韩红,陈奕迅,陈羽凡&胡海泉=羽泉,M?M,......(歌手名称很多,都是以,分割的)
song=回来,放不下心,盛夏的果实,........(歌曲名也很多,也都是以,分割的)

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2013-5-10 09:15:02 | 显示全部楼层
本帖最后由 batman 于 2013-5-10 09:19 编辑

  1. @echo off&setlocal enabledelayedexpansion
  2. set "singer=."&set "song=_"
  3. for /f "tokens=1,2 delims==" %%a in (a.txt) do (
  4.   set "str=%%b"&set "str=!str:,= !"
  5.   for %%c in (!str!) do set "!%%a!#!random!#%%c=a"
  6. )
  7. for %%a in (. _) do (
  8.   set "flag="
  9.   for /f "tokens=3 delims==#" %%b in ('set %%a') do if not defined flag echo %%b&set "flag=a"
  10. )
  11. pause>nul
复制代码

评分

参与人数 1技术 +1 收起 理由
hijackle + 1 感谢

查看全部评分

发表于 2013-5-10 14:58:21 | 显示全部楼层
本帖最后由 terse 于 2013-5-10 14:59 编辑

不考虑空格 和其他特殊情况
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1* delims==" %%a in (a.txt) do (
  3.     set arr=&set "str=%%b"
  4.     for %%i in (!str:,^= !) do set "arr=!arr! !random!!random!!random!#%%i"
  5.     for /f "tokens=1* delims=#" %%c in ('(for %%i in (!arr!^) do echo %%i^)^|sort') do set str=%%d
  6.     echo !str!
  7. )
  8. pause>nul
复制代码
发表于 2013-5-10 15:56:18 | 显示全部楼层
本帖最后由 apang 于 2013-5-12 18:25 编辑
  1. Set fso = CreateObject("Scripting.FileSystemObject")
  2. Set file = fso.OpenTextFile("a.txt")
  3. Randomize()
  4. Do Until file.AtEndOfStream
  5.    a = file.ReadLine
  6.    arr = Split(Right(a,Len(a)-InStr(a,"=")),",")
  7.    str = str & arr(Int(Rnd * (UBound(arr) + 1))) & vbLf
  8. Loop
  9. WScript.Echo str
复制代码
 楼主| 发表于 2013-5-12 01:26:41 | 显示全部楼层
追问一下,如果文本中含有特殊符号&和=怎么屏蔽,比如
有一段文本,内容如下:

singer=张信哲,张宇,韩红,陈奕迅,陈羽凡&胡海泉=羽泉,......(歌手名称很多,都是以,分割的)
song=回来,放不下心,盛夏的果实,........(歌曲名也很多,也都是以,分割的)


歌手名和歌曲名的数量都是不确定的,如何快速的随机获取一个歌手名和歌曲名,不要求歌手和歌曲对应的,就随机获取就可以,最好不要生成临时文件
发表于 2013-5-12 18:31:30 | 显示全部楼层
回复 5# hijackle

可以处理&和=字符,不能处理 !、^、*、?字符,你看着办
  1. @echo off
  2. for /f "tokens=1* delims==" %%a in (a.txt) do (
  3.    set "str=%%b"
  4.    setlocal enabledelayedexpansion
  5.    for %%c in ("!str:,=" "!") do set /a n+=1&set ".!n!=%%~c"
  6.    set /a r = !random! %% n + 1
  7.    for %%b in (!r!) do echo !.%%b!
  8.    endlocal
  9. )
  10. pause
复制代码
 楼主| 发表于 2013-5-12 21:43:54 | 显示全部楼层
本帖最后由 hijackle 于 2013-5-12 21:45 编辑

再追问一下,如果要处理?咋办?一定有了?,问号之前的值好像是永远都随即不出来的

非常感谢楼上的几位的耐心解答
发表于 2013-5-12 21:49:03 | 显示全部楼层
回复 7# hijackle


    请在顶楼把需要处理的特殊字符一次说完,不要一个一个往外蹦。
 楼主| 发表于 2013-5-12 22:15:19 | 显示全部楼层
本帖最后由 hijackle 于 2013-5-12 22:18 编辑

好的,麻烦
顶楼补齐了

最后一次追问一下,如果文本中含有特殊符号&和=和?怎么办,(其他符号比如_和-应该不会对代码有影响的吧),比如文本如下:

singer=张信哲,张宇,韩红,陈奕迅,陈羽凡&胡海泉=羽泉,M?M,......(歌手名称很多,都是以,分割的)
song=回来,放不下心,盛夏的果实,........(歌曲名也很多,也都是以,分割的)
发表于 2013-5-13 01:23:37 | 显示全部楼层
也不通用

  1. @echo off&setlocal enabledelayedexpansion
  2. if "%~1" == "" (
  3.         for /f "tokens=1* delims==" %%a in (a.txt) do (
  4.                 for /f "tokens=2 delims=" %%c in ('%~s0 "%%b"^|sort') do set str=%%c
  5.                 echo !str!
  6.         )
  7.                 pause&exit
  8. ) else (
  9. :LP
  10.         for /f "tokens=1* delims=," %%i in (%1) do (
  11.                 echo "!random!!random!!random!%%i"
  12.                 call :lp "%%j"
  13.         )
  14. )
复制代码
 楼主| 发表于 2013-5-13 10:56:17 | 显示全部楼层
楼上的代码的确可以解决了,感谢中
顺便问下代码可以优化一下吗?
for 里面去call本身的循环,貌似文本里面的,分割的很多的话,执行效率是个问题啊
发表于 2013-5-13 13:11:03 | 显示全部楼层
回复 11# hijackle
并比一个 ? 字符 应该还有  比如 * 所以 鱼和熊掌了 没办法
下面代码 对于字符  "* 还无能为力

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1* delims==" %%a in (t.txt) do (
  3.     set n=&set any=&set "str=%%b"
  4.     set str="!str:,=" "!"
  5.     set str=!str:?=!
  6.     for %%i in (!str!) do set any=!any! "!random!!random!!random!%%~i"
  7.     for /f "tokens=2 delims=" %%c in ('(for %%i in (!any!^) do echo %%i^)^|sort') do set str=%%c
  8.     echo !str:=?!
  9. )
  10. pause>nul
复制代码

评分

参与人数 1技术 +1 收起 理由
hijackle + 1 乐于助人

查看全部评分

 楼主| 发表于 2013-5-13 14:18:41 | 显示全部楼层
明白了,谢谢了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 05:56 , Processed in 0.023273 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表