Board logo

标题: [文本处理] 求助;文件夹中有200个txt文本文件想随机选取2个不重复的另存 [打印本页]

作者: hkldd    时间: 2019-12-28 17:42     标题: 求助;文件夹中有200个txt文本文件想随机选取2个不重复的另存

各位老师;我有一个文件中有200个txt文本文件,想随机毎次抽取2个文本文件,保存到一个按数字序号命名文件夹中,要求不重复不断的抽取,也不知能组合成多少个文件,想请各位老师写个批处理,让我测试一下,谢谢!
  文件中的txt文本文件已经是按数字命名的(001.txt、002.txt、003.txt……200.tx),想得到按数序递增的文件夹(例如01号中有001.txt、002.txt、02号有002.txt、003.txt等,)只要不重复就可以,一直随机抽
作者: hlzj88    时间: 2019-12-29 08:44

所谓随机,就不应当有  01号中有001.txt、002.txt  这样有序排列的描述。
所谓不重复,用过了就不可以再用,200/2  只能有100种组合。一个箱子内有200个球,你左右手都一次只能取一个,问双手同时取多少次能取完。
作者: hkldd    时间: 2019-12-29 10:15

呵呵,可能是我没描述清楚,是这样的,在一个文件夹中有编号001.txt至200.txt命名的文档,毎次随机抽2个文本保存到一个新文件夹中,所抽取的文本不重复,新文件夹也用数字顺序命名就行,想了解这200个文本到底能组合多少个文件
作者: went    时间: 2019-12-29 12:31

不重复,是每个文件只出现一次,还是抽取的两个文件的组合只出现一次?
是想得到组合成的文件,还是只需要得到能组合的个数?
作者: hkldd    时间: 2019-12-29 22:12

@went;毎次都是在200个文件夹中随机抽取,不重复是指,两个文件的组合只出现一次,想得到这些组合成的文件全部组合
作者: hlzj88    时间: 2019-12-30 05:38

回复 5# hkldd
你的意思是 假设已有一次完整的200/2的完整组合后,假设我们只对其中两次的随机数进行了交换,这样的又算100次,以此类推,所有的共能有多少组合机会。假设是这样问,也是可以有答案的。好像在高中就学过这种排列组合题,哎,当年我学的太差了。会有人列出来的。
作者: FOR    时间: 2019-12-31 19:21

  1. @echo off&setlocal enabledelayedexpansion
  2. set /a wjj=1000000,w=1200
  3. for /l %%i in (1001 1 !w!) do (
  4. set /a n=%%i+1
  5. for /l %%j in (!n! 1 !w!) do (
  6. set /a wjj+=1
  7. set var=%%i&set num=%%j
  8.         echo !var:~-3!  !num:~-3! = !wjj:~-5!
  9. )
  10. )
  11. echo;
  12. pause
复制代码

作者: WHY    时间: 2020-1-6 23:40

本帖最后由 WHY 于 2020-1-10 15:17 编辑
  1. REM 从m个数据中选取n个数求组合VBS(m>=n>0)
  2. Dim m, n, file
  3. m = 200
  4. n = 2
  5. file = "Result.txt"
  6. Dim strTmp, s, fso, arrIn, arrOut, x
  7. strTmp = ""
  8. s = ""
  9. x = 0
  10. Set fso = CreateObject("Scripting.FileSystemObject")
  11. ReDim arrIn(m)                        '定义输入数组
  12. ReDim arrOut(x)                       '定义输出数组
  13. Dim i
  14. For i = 1 To m
  15.     arrIn(i-1) = Right(1000 + i, 3)   '输入数组赋值
  16.     If i <= n Then
  17.         s = s + " " + arrIn(i-1)
  18.         strTmp = strTmp + "1"
  19.     Else
  20.         strTmp = strTmp + "0"
  21.     End If
  22. Next
  23. arrOut(x) = Mid(s, 2)                 '输出数组赋值
  24. Dim reg1, reg2
  25. Set reg1 = New RegExp
  26. Set reg2 = New RegExp
  27. reg1.Pattern = "1"
  28. reg1.Global  = True
  29. reg2.Pattern = "^(0*)(1*)10"
  30. Do while InStr(strTmp, "10") > 0
  31.     s = ""
  32.     x = x + 1
  33.     ReDim Preserve arrOut(x)
  34.     strTmp = reg2.Replace(strTmp, "$2$101")  '交换strTmp行首0和1,第一个10改成01
  35.     Dim match
  36.     For Each match In reg1.Execute(strTmp)
  37.         s = s + " " + arrIn(match.FirstIndex)
  38.     Next
  39.     arrOut(x) = Mid(s, 2)            '输出数组赋值
  40.     If x = 5000 Then                 '最大下标为5000时写入文本,并清空arrOut
  41.         x = 0
  42.         fso.OpenTextFile(file, 8, True).Write Join(arrOut, vbCrLf)
  43.         ReDim arrOut(x)
  44.     End If
  45. Loop
  46. If x > 0 Then fso.OpenTextFile(file, 8, True).Write Join(arrOut, vbCrLf)
  47. MsgBox "Done"
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2