Board logo

标题: [文本处理] 文件名乱序排列批处理如何写(部分解决了)? [打印本页]

作者: netdzb    时间: 2021-5-24 14:29     标题: 文件名乱序排列批处理如何写(部分解决了)?

本帖最后由 netdzb 于 2021-5-24 21:24 编辑

文件夹下面有lrq001.txt,lrq002.txt,lrq003.txt......,lrq100.txt,
100个文件,也有可能是200个文件,文件的数量不定的。

现在需要把文件做乱序排列,不能重复,批处理应该如何完成。

我的思路是统计出文件的数量,一个for和do就可以完成
然后random产生随机数字,然后不能让数字重复该如何做?
这个算法有点类似象排列组合啊。
作者: newswan    时间: 2021-5-24 14:44

比如 1-9,9个数,现在顺序排列
1、1-9中随机取一个数,比如,是 a ,将 a 和 1 交换,
2、2-9中随机取一个数,比如,是 b ,将 b 和 2 交换
……
8、8-9中随机取一个数
作者: Gin_Q    时间: 2021-5-24 14:51

  1. >>> import random
  2. >>> a = list(range(1,20))
  3. >>> a
  4. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
  5. >>> random.shuffle(a)
  6. >>> a
  7. [5, 14, 4, 6, 1, 12, 11, 13, 7, 3, 17, 10, 16, 8, 18, 19, 15, 9, 2]
  8. >>>
复制代码

作者: qixiaobin0715    时间: 2021-5-24 15:59

笨办法,如果文件数为n,取随机数字:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%a in (1,1,!n!) do set #!random!=%%a
  4. for /f "tokens=2 delims==" %%i in ('set #') do echo,%%i
  5. pause
复制代码

作者: qixiaobin0715    时间: 2021-5-24 16:07

本帖最后由 qixiaobin0715 于 2021-5-24 16:09 编辑

为了保险起见,可以多加1个!random!:set #!random!!random!=%%a
作者: netdzb    时间: 2021-5-24 16:21

回复 4# qixiaobin0715


    in ('set #') 这个代码是什么意思啊? 我这边报环境变量错误。
作者: qixiaobin0715    时间: 2021-5-24 16:29

显示所有变量名以#开头的变量。在3~4行之间加入set #,pause一下,试试
作者: qixiaobin0715    时间: 2021-5-24 16:30

n先取10,试试
作者: qixiaobin0715    时间: 2021-5-24 16:35

实际上这种效率不高,超过10000文件,最好想别的办法。
作者: netdzb    时间: 2021-5-24 16:38

回复 9# qixiaobin0715

如果采取深度搜索的算法速度是否可以快一点,就是设置一个标志位,标志空的时候可以分配数字,
标志满的时候这个数字就不能分配。
作者: qixiaobin0715    时间: 2021-5-24 16:42

所学有限,不懂,你可以试试嘛。成功的话可以分享一下。
作者: netdzb    时间: 2021-5-24 17:10

回复 11# qixiaobin0715

我只会这个的递归写法,非递归我写不出来。
https://blog.csdn.net/weixin_39910711/article/details/100692318
作者: newswan    时间: 2021-5-24 19:23

  1. for /f "usebackq delims=" %%a in (`dir /b *.txt`) do (
  2.     call :f "%%a"
  3. )
  4. for /f "usebackq tokens=2 delims==" %%a in (`set _`) do (
  5.     echo %%a
  6. )
  7. goto :END
  8. :f
  9. set n=%random%
  10. if defind _%n% goto :f
  11. set _%n%=%~1
  12. goto :eof
复制代码
random 范围是32768
不要求连续,只要不重复就行
作者: qixiaobin0715    时间: 2021-5-24 19:59

回复 13# newswan
解决了我的代码可能会出现重复数字的问题,但in ('set ')效率不高的问题还是个遗憾。
作者: newswan    时间: 2021-5-24 21:36

还有个问题,能存储多少变量?
作者: qixiaobin0715    时间: 2021-5-24 21:39

10000是没问题的,不过效率明显下降。
作者: went    时间: 2021-5-24 22:00

这里面有没有你需要的http://www.bathome.net/viewthread.php?tid=55180
作者: netdzb    时间: 2021-5-25 10:14

回复 17# went

我想参考这个链接的代码修改,

@echo off
set "max=100"
set "min=40"
set "n=20"
set /a "a=%random%%%(%max%-%min%+1)+%min%"
echo %a%>random.txt
pause

随机数是产生了,问题是如何记录随机数字已经被使用过了。
40~100的随机数字,不重复,不遗漏。
我不知道如何利用上面的模版进行修改?
作者: qixiaobin0715    时间: 2021-5-25 11:12

回复 18# netdzb
参考13楼代码就行了,数字不大,效率就不是问题了。
作者: netdzb    时间: 2021-5-25 11:34

回复 19# qixiaobin0715

13楼的代码报错,测试文件都在网盘附件上面。
https://javame.lanzoui.com/iVnqFpg5vtg

%%a in (`set _`)  批处理也有linux的用法吗?
作者: newswan    时间: 2021-5-25 11:50

  1. @echo off
  2. for /f "usebackq delims=" %%a in (`dir /b *.txt`) do (
  3.     call :f "%%a"
  4. )
  5. for /f "usebackq tokens=2 delims==" %%a in (`set _`) do (
  6.     echo %%a
  7. )
  8. goto :END
  9. :f
  10. set n=%random%
  11. if defined _%n% goto :f
  12. set _%n%=%~1
  13. goto :eof
  14. :END
复制代码
拼写错误。。。。
作者: newswan    时间: 2021-5-25 11:52

回复 20# netdzb


    set _ 输出 _开头的变量
作者: netdzb    时间: 2021-5-25 12:02

回复 21# newswan

xls006.txt
xls003.txt
xls007.txt
xls002.txt
xls009.txt
xls004.txt
xls005.txt
xls001.txt
xls010.txt
xls008.txt
1

运行结果多了一个1,而且第2次运行会产生20多行数据。
作者: went    时间: 2021-5-25 12:04

回复 18# netdzb

上面帖子里有现成的
  1. @echo off & cd /d "%~dp0"
  2. call :getSingleRandom 40 100 20
  3. echo 随机字符串:%randomStr%
  4. for %%i in (%randomStr%) do echo %%i
  5. pause&exit
  6. REM 方法:获取单一随机数 call :getSingleRandom 最小值 最大值 随机数个数
  7. :getSingleRandom
  8. set "n=%~3"
  9. set "randomStr= "
  10. :loop
  11. set /a "a=%random%%%(%~2-%~1+1)+%~1"
  12. call set "newStr=%%randomStr:%a%=%%"
  13. if "%newStr%" equ "%randomStr%" (
  14. set "randomStr=%randomStr% %a%"
  15. set /a "n-=1"
  16. )
  17. if "%n%" neq "0" goto :loop
  18. goto :eof
复制代码

作者: netdzb    时间: 2021-5-25 12:27

回复 24# went

第2行改成下面的都是死机
call :getSingleRandom 1 100 98
call :getSingleRandom 1 100 99
call :getSingleRandom 1 100 100

=======================

call :getSingleRandom 1 100 90 可以通过。
作者: qixiaobin0715    时间: 2021-5-25 12:45

用数字测试可以。
  1. @echo off
  2. for /l %%a in (40,1,100) do (
  3.     call :f %%a
  4. )
  5. for /f "usebackq tokens=2 delims==" %%i in (`set #`) do (
  6.     echo %%i
  7. )
  8. pause
  9. goto :eof
  10. :f
  11. set n=%random%
  12. if defined #%n% goto :f
  13. set #%n%=%~1
  14. goto :eof
  15. pause
复制代码

作者: newswan    时间: 2021-5-25 12:54

回复 23# netdzb


    下载你发的,已测试,没有问题
作者: newswan    时间: 2021-5-25 12:56

1到10的随机排列
  1. @echo off
  2. setlocal enableDelayedExpansion
  3. rem 1..10
  4. for /l %%a in (1,1,10) do (
  5.     set _%%a=x%%a
  6. )
  7. echo   sequences
  8. for /l %%a in (1,1,10) do (
  9.     echo !_%%a!
  10. )
  11. rem 随机
  12. for /l %%a in (1,1,9) do (
  13.     call :f %%a 10
  14. )
  15. echo   random
  16. for /l %%a in (1,1,10) do (
  17.     echo !_%%a!
  18. )
  19. goto :END
  20. :f
  21. set /a n=%random%%%(%2-%1+1)+%1
  22. if %n%==%1 goto :eof
  23. set t=!_%n%!
  24. set _%n%=!_%1!
  25. set _%1=%t%
  26. goto :eof
  27. :END
复制代码

作者: went    时间: 2021-5-25 12:58

我觉得你可以用powershell,win7也支持
  1. powershell -c "40..100 | Sort-Object {return Get-Random}"
复制代码

作者: went    时间: 2021-5-25 13:01

只取10个
  1. powershell -c "40..100 | Sort-Object {return Get-Random} | Select-Object -First 10"
复制代码

作者: netdzb    时间: 2021-5-25 13:02

回复 29# went

好的,我是试验一下,谢谢!
作者: qixiaobin0715    时间: 2021-5-25 13:07

回复 23# netdzb
多出个1,说明系统里本身就有1个以_开头的变量存在。打开cmd窗口:输入set _,回车试试。




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