标题: [文本处理] 批处理如何在txt文本中按行来随机提取N个生成的结果再放到新的txt里? [打印本页]
作者: smallbat 时间: 2012-12-13 17:21 标题: 批处理如何在txt文本中按行来随机提取N个生成的结果再放到新的txt里?
刚注册了贵论坛,有种似曾相识的感觉,在论坛里面转了一圈,确实不错!今晚开始补课充电!
先请教大家一个问题
在一个txt里面有很多行网址,现在想用批处理随机的用法将里面的网址随机N条(这个N可以改动)提取出来,并放在同级目录里面生成一个新的txt!
比如一个txt里面的内容如下
1
2
3
4
5
6
7
8
9
需要处理的结果是随机提取N=6个出来放在新的txt里面
比如生成后的新txt是
5
6
1
4
8
初到贵论坛,还望海涵!
作者: jains521 时间: 2012-12-13 20:53
- @echo off &setlocal enabledelayedexpansion
- for /f "delims=" %%i in (111.txt) do (
- call :rd
- set f_!rd!=%%i
- )
- )
- set n=5
- for /f "delims==" %%i in ('set f_') do (
- set /a "x+=1, 1/( x%%(n+1) )" 2>nul &&echo !%%i! || goto end
- )
- :end
- pause
- goto :eof
- :rd
- set /a rd=%random%
- if defined f_%rd% goto rd
- goto :eof
复制代码
作者: apang 时间: 2012-12-13 21:35
本帖最后由 apang 于 2012-12-13 23:24 编辑
存放网址的文件为a.txt,生成新文件b.txt。代码保存为test.bat与a.txt放在一起- @echo off&setlocal enabledelayedexpansion
- set N=12
- for /f "delims=" %%a in (a.txt) do (
- set /a L+=1
- set "_!L!=%%a"
- )
- if %N% gtr %L% set N=%L%
- (for /l %%a in (1 1 %N%) do call :Loop)>b.txt
- goto :eof
-
- :Loop
- set /a r=%random% %% L + 1
- if defined .%r% (goto :Loop) else set .%r%=1&echo,!_%r%!
复制代码
vbs,只是练习。。。- N = 6
- Set FSO = CreateObject("Scripting.FileSystemObject")
- Text = FSO.OpenTextFile("a.txt",1).ReadAll
- Arr = Split(Text,vbCrLf)
- ReDim B(Ubound(Arr))
- If N > UBound(Arr) + 1 Then N = UBound(Arr) + 1
- Do Until N = i
- Randomize
- r = Int((Ubound(Arr) + 1)* Rnd)
- If B(r) = "" Then
- Str = Str & Arr(r) & vbCrLf
- B(r) = "1" : i = i + 1
- End If
- Loop
- FSO.OpenTextFile("b.txt",2,True).Write Str
- MsgBox "OK"
复制代码
作者: 悬崖之树 时间: 2012-12-18 22:25
- @echo off & setlocal enabledelayedexpansion
- for /f %%i in (a.txt) do (
- set /a n+=1
- set _!n!=%%i
- )
- echo 共有%n%行
-
- for /l %%i in (1 1 5) do (
- set /a m=!random!%%%n%+1
- call echo %%_!m!%%
- )
- pause
复制代码
作者: batman 时间: 2012-12-19 01:19
本帖最后由 batman 于 2012-12-19 01:22 编辑
楼上会出现重复选取的情况。。。还是用乱序法吧:- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in (a.txt) do (
- set /a n+=1
- set "_!random!_!n!=%%a"
- )
- (for /f "tokens=1* delims==" %%a in ('set _') do (
- set /a m+=1
- if !m! leq 5 echo,%%b
- ))>new.txt
- start new.txt
复制代码
作者: batman 时间: 2012-12-19 01:21
回复 3# apang
vbs可以和批一个思路,也可以利用instr函数来判断是否重复选取
作者: apang 时间: 2012-12-19 12:13
回复 6# batman
感谢老大指点!- Set FSO = CreateObject("Scripting.FileSystemObject")
- Set File = FSO.OpenTextFile("a.txt",1)
- Do Until File.AtEndOfStream
- ReDim Preserve Arr(i)
- Arr(i) = File.ReadLine
- i = i + 1
- Loop
-
- Do Until N = 6
- Randomize
- r = Int((UBound(Arr) + 1) * Rnd)
- If InStr(Str,Arr(r)) = 0 Then
- Str = Str & Arr(r) & vbCrLf
- N = N + 1
- End If
- Loop
- FSO.OpenTextFile("b.txt",2,True).Write Str
- MsgBox "OK"
复制代码
作者: smallbat 时间: 2012-12-24 18:22
jains521 发表于 2012-12-13 20:53
你好,兄弟,如何将你这个生成的结果写入 b.txt呢
作者: smallbat 时间: 2012-12-24 18:23
回复 5# batman
您好版主,假如扩展下来,文件夹内不是只有一个txt 而是一批txt需要按照这样的方式处理,如何写呢
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |