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

[文本处理] 批处理如何在txt文本中按行来随机提取N个生成的结果再放到新的txt里?

[复制链接]
发表于 2012-12-13 17:21:06 | 显示全部楼层 |阅读模式
刚注册了贵论坛,有种似曾相识的感觉,在论坛里面转了一圈,确实不错!今晚开始补课充电!
先请教大家一个问题
在一个txt里面有很多行网址,现在想用批处理随机的用法将里面的网址随机N条(这个N可以改动)提取出来,并放在同级目录里面生成一个新的txt!
比如一个txt里面的内容如下

1
2
3
4
5
6
7
8
9

需要处理的结果是随机提取N=6个出来放在新的txt里面
比如生成后的新txt是
5
6
1
4
8

初到贵论坛,还望海涵!
发表于 2012-12-13 20:53:40 | 显示全部楼层
  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
复制代码
发表于 2012-12-13 21:35:09 | 显示全部楼层
本帖最后由 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"
复制代码
发表于 2012-12-18 22:25:08 | 显示全部楼层
  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
复制代码
发表于 2012-12-19 01:19:45 | 显示全部楼层
本帖最后由 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
复制代码
发表于 2012-12-19 01:21:48 | 显示全部楼层
回复 3# apang


    vbs可以和批一个思路,也可以利用instr函数来判断是否重复选取
发表于 2012-12-19 12:13:42 | 显示全部楼层
回复 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"
复制代码
 楼主| 发表于 2012-12-24 18:22:38 | 显示全部楼层
jains521 发表于 2012-12-13 20:53



    你好,兄弟,如何将你这个生成的结果写入 b.txt呢
 楼主| 发表于 2012-12-24 18:23:42 | 显示全部楼层
回复 5# batman


    您好版主,假如扩展下来,文件夹内不是只有一个txt 而是一批txt需要按照这样的方式处理,如何写呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 18:37 , Processed in 0.022424 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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