[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

本帖最后由 hijackle 于 2013-5-13 14:19 编辑

有一段文本,内容如下:

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


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

高手帮忙


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

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


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

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

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

本帖最后由 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

评分人数

***共同提高***

TOP

本帖最后由 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
复制代码

TOP

本帖最后由 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
复制代码

TOP

追问一下,如果文本中含有特殊符号&和=怎么屏蔽,比如
有一段文本,内容如下:

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


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

TOP

回复 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
复制代码

TOP

本帖最后由 hijackle 于 2013-5-12 21:45 编辑

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

非常感谢楼上的几位的耐心解答

TOP

回复 7# hijackle


    请在顶楼把需要处理的特殊字符一次说完,不要一个一个往外蹦。

TOP

本帖最后由 hijackle 于 2013-5-12 22:18 编辑

好的,麻烦
顶楼补齐了

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

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

TOP

也不通用
  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. )
复制代码

TOP

楼上的代码的确可以解决了,感谢中
顺便问下代码可以优化一下吗?
for 里面去call本身的循环,貌似文本里面的,分割的很多的话,执行效率是个问题啊

TOP

回复 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

评分人数

TOP

明白了,谢谢了

TOP

返回列表