标题: [文本处理] [已解决]求助批处理在文本中取随机值 [打印本页]
作者: hijackle 时间: 2013-5-10 07:28 标题: [已解决]求助批处理在文本中取随机值
本帖最后由 hijackle 于 2013-5-13 14:19 编辑
有一段文本,内容如下:
singer=张信哲,张宇,韩红,陈奕迅,......(歌手名称很多,都是以,分割的)
song=回来,放不下心,盛夏的果实,........(歌曲名也很多,也都是以,分割的)
歌手名和歌曲名的数量都是不确定的,如何快速的随机获取一个歌手名和歌曲名,不要求歌手和歌曲对应的,就随机获取就可以,最好不要生成临时文件
高手帮忙
追问一下,如果文本中含有特殊符号&和=怎么办,比如文本如下:
singer=张信哲,张宇,韩红,陈奕迅,陈羽凡&胡海泉=羽泉,......(歌手名称很多,都是以,分割的)
song=回来,放不下心,盛夏的果实,........(歌曲名也很多,也都是以,分割的)
最后一次追问一下,如果文本中含有特殊符号&和=和?怎么办,(其他符号比如_和-应该不会对代码有影响的吧),比如文本如下:
singer=张信哲,张宇,韩红,陈奕迅,陈羽凡&胡海泉=羽泉,M?M,......(歌手名称很多,都是以,分割的)
song=回来,放不下心,盛夏的果实,........(歌曲名也很多,也都是以,分割的)
作者: batman 时间: 2013-5-10 09:15
本帖最后由 batman 于 2013-5-10 09:19 编辑
- @echo off&setlocal enabledelayedexpansion
- set "singer=."&set "song=_"
- for /f "tokens=1,2 delims==" %%a in (a.txt) do (
- set "str=%%b"&set "str=!str:,= !"
- for %%c in (!str!) do set "!%%a!#!random!#%%c=a"
- )
- for %%a in (. _) do (
- set "flag="
- for /f "tokens=3 delims==#" %%b in ('set %%a') do if not defined flag echo %%b&set "flag=a"
- )
- pause>nul
复制代码
作者: terse 时间: 2013-5-10 14:58
本帖最后由 terse 于 2013-5-10 14:59 编辑
不考虑空格 和其他特殊情况- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1* delims==" %%a in (a.txt) do (
- set arr=&set "str=%%b"
- for %%i in (!str:,^= !) do set "arr=!arr! !random!!random!!random!#%%i"
- for /f "tokens=1* delims=#" %%c in ('(for %%i in (!arr!^) do echo %%i^)^|sort') do set str=%%d
- echo !str!
- )
- pause>nul
复制代码
作者: apang 时间: 2013-5-10 15:56
本帖最后由 apang 于 2013-5-12 18:25 编辑
- Set fso = CreateObject("Scripting.FileSystemObject")
- Set file = fso.OpenTextFile("a.txt")
- Randomize()
- Do Until file.AtEndOfStream
- a = file.ReadLine
- arr = Split(Right(a,Len(a)-InStr(a,"=")),",")
- str = str & arr(Int(Rnd * (UBound(arr) + 1))) & vbLf
- Loop
- WScript.Echo str
复制代码
作者: hijackle 时间: 2013-5-12 01:26
追问一下,如果文本中含有特殊符号&和=怎么屏蔽,比如
有一段文本,内容如下:
singer=张信哲,张宇,韩红,陈奕迅,陈羽凡&胡海泉=羽泉,......(歌手名称很多,都是以,分割的)
song=回来,放不下心,盛夏的果实,........(歌曲名也很多,也都是以,分割的)
歌手名和歌曲名的数量都是不确定的,如何快速的随机获取一个歌手名和歌曲名,不要求歌手和歌曲对应的,就随机获取就可以,最好不要生成临时文件
作者: apang 时间: 2013-5-12 18:31
回复 5# hijackle
可以处理&和=字符,不能处理 !、^、*、?字符,你看着办- @echo off
- for /f "tokens=1* delims==" %%a in (a.txt) do (
- set "str=%%b"
- setlocal enabledelayedexpansion
- for %%c in ("!str:,=" "!") do set /a n+=1&set ".!n!=%%~c"
- set /a r = !random! %% n + 1
- for %%b in (!r!) do echo !.%%b!
- endlocal
- )
- pause
复制代码
作者: hijackle 时间: 2013-5-12 21:43
本帖最后由 hijackle 于 2013-5-12 21:45 编辑
再追问一下,如果要处理?咋办?一定有了?,问号之前的值好像是永远都随即不出来的
非常感谢楼上的几位的耐心解答
作者: BAT-VBS 时间: 2013-5-12 21:49
回复 7# hijackle
请在顶楼把需要处理的特殊字符一次说完,不要一个一个往外蹦。
作者: hijackle 时间: 2013-5-12 22:15
本帖最后由 hijackle 于 2013-5-12 22:18 编辑
好的,麻烦
顶楼补齐了
最后一次追问一下,如果文本中含有特殊符号&和=和?怎么办,(其他符号比如_和-应该不会对代码有影响的吧),比如文本如下:
singer=张信哲,张宇,韩红,陈奕迅,陈羽凡&胡海泉=羽泉,M?M,......(歌手名称很多,都是以,分割的)
song=回来,放不下心,盛夏的果实,........(歌曲名也很多,也都是以,分割的)
作者: terse 时间: 2013-5-13 01:23
也不通用- @echo off&setlocal enabledelayedexpansion
- if "%~1" == "" (
- for /f "tokens=1* delims==" %%a in (a.txt) do (
- for /f "tokens=2 delims=" %%c in ('%~s0 "%%b"^|sort') do set str=%%c
- echo !str!
- )
- pause&exit
- ) else (
- :LP
- for /f "tokens=1* delims=," %%i in (%1) do (
- echo "!random!!random!!random!%%i"
- call :lp "%%j"
- )
- )
复制代码
作者: hijackle 时间: 2013-5-13 10:56
楼上的代码的确可以解决了,感谢中
顺便问下代码可以优化一下吗?
for 里面去call本身的循环,貌似文本里面的,分割的很多的话,执行效率是个问题啊
作者: terse 时间: 2013-5-13 13:11
回复 11# hijackle
并比一个 ? 字符 应该还有 比如 * 所以 鱼和熊掌了 没办法
下面代码 对于字符 "* 还无能为力- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1* delims==" %%a in (t.txt) do (
- set n=&set any=&set "str=%%b"
- set str="!str:,=" "!"
- set str=!str:?=!
- for %%i in (!str!) do set any=!any! "!random!!random!!random!%%~i"
- for /f "tokens=2 delims=" %%c in ('(for %%i in (!any!^) do echo %%i^)^|sort') do set str=%%c
- echo !str:=?!
- )
- pause>nul
复制代码
作者: hijackle 时间: 2013-5-13 14:18
明白了,谢谢了
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |