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

[文本处理] 批处理如何在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

初到贵论坛,还望海涵!

  1. @echo off &setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (111.txt) do (
  3. call :rd
  4. set f_!rd!=%%i
  5. )
  6. )
  7. set n=5
  8. for /f "delims==" %%i in ('set f_') do (
  9. set /a "x+=1, 1/( x%%(n+1) )" 2>nul &&echo !%%i! || goto end
  10. )
  11. :end
  12. pause
  13. goto :eof
  14. :rd
  15. set /a rd=%random%
  16. if defined f_%rd% goto rd
  17. goto :eof
复制代码
非常批处理3群:56794763
有偿写程序.
批处理, lua, c, c++, vba, php, css

TOP

本帖最后由 apang 于 2012-12-13 23:24 编辑

存放网址的文件为a.txt,生成新文件b.txt。代码保存为test.bat与a.txt放在一起
  1. @echo off&setlocal enabledelayedexpansion
  2. set N=12
  3. for /f "delims=" %%a in (a.txt) do (
  4.   set /a L+=1
  5.   set "_!L!=%%a"
  6. )
  7. if %N% gtr %L% set N=%L%
  8. (for /l %%a in (1 1 %N%) do call :Loop)>b.txt
  9. goto :eof
  10. :Loop
  11. set /a r=%random% %% L + 1
  12. if defined .%r% (goto :Loop) else set .%r%=1&echo,!_%r%!
复制代码
vbs,只是练习。。。
  1. N = 6
  2. Set FSO = CreateObject("Scripting.FileSystemObject")
  3. Text = FSO.OpenTextFile("a.txt",1).ReadAll
  4. Arr = Split(Text,vbCrLf)
  5. ReDim B(Ubound(Arr))
  6. If N > UBound(Arr) + 1 Then N = UBound(Arr) + 1
  7. Do Until N = i
  8.    Randomize
  9.    r = Int((Ubound(Arr) + 1)* Rnd)
  10.    If B(r) = "" Then
  11.       Str = Str & Arr(r) & vbCrLf
  12.       B(r) = "1" : i = i + 1
  13.    End If
  14. Loop
  15. FSO.OpenTextFile("b.txt",2,True).Write Str
  16. MsgBox "OK"
复制代码

TOP

  1. @echo off & setlocal enabledelayedexpansion
  2. for /f %%i in (a.txt) do (
  3.    set /a n+=1
  4.    set _!n!=%%i
  5. )
  6. echo 共有%n%行
  7. for /l %%i in (1 1 5) do (
  8.    set /a m=!random!%%%n%+1
  9.    call echo %%_!m!%%
  10. )
  11. pause
复制代码
时光荏苒||新陈代谢&&涛声依旧||本性难移

TOP

本帖最后由 batman 于 2012-12-19 01:22 编辑

楼上会出现重复选取的情况。。。还是用乱序法吧:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (a.txt) do (
  3.   set /a n+=1
  4.   set "_!random!_!n!=%%a"
  5. )
  6. (for /f "tokens=1* delims==" %%a in ('set _') do (
  7.   set /a m+=1
  8.   if !m! leq 5 echo,%%b
  9. ))>new.txt
  10. start new.txt
复制代码
***共同提高***

TOP

回复 3# apang


    vbs可以和批一个思路,也可以利用instr函数来判断是否重复选取
***共同提高***

TOP

回复 6# batman

感谢老大指点!
  1. Set FSO = CreateObject("Scripting.FileSystemObject")
  2. Set File = FSO.OpenTextFile("a.txt",1)
  3. Do Until File.AtEndOfStream
  4.    ReDim Preserve Arr(i)
  5.    Arr(i) = File.ReadLine
  6.    i = i + 1
  7. Loop
  8. Do Until N = 6
  9.    Randomize
  10.    r = Int((UBound(Arr) + 1) * Rnd)
  11.    If InStr(Str,Arr(r)) = 0 Then
  12.       Str = Str & Arr(r) & vbCrLf
  13.       N = N + 1
  14.    End If
  15. Loop
  16. FSO.OpenTextFile("b.txt",2,True).Write Str
  17. MsgBox "OK"
复制代码

TOP

jains521 发表于 2012-12-13 20:53



    你好,兄弟,如何将你这个生成的结果写入 b.txt呢

TOP

回复 5# batman


    您好版主,假如扩展下来,文件夹内不是只有一个txt 而是一批txt需要按照这样的方式处理,如何写呢

TOP

返回列表