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

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

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

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

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

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

比如 1-9,9个数,现在顺序排列
1、1-9中随机取一个数,比如,是 a ,将 a 和 1 交换,
2、2-9中随机取一个数,比如,是 b ,将 b 和 2 交换
……
8、8-9中随机取一个数

TOP

  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. >>>
复制代码
QQ:1972544783

TOP

笨办法,如果文件数为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
复制代码

TOP

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

为了保险起见,可以多加1个!random!:set #!random!!random!=%%a

TOP

回复 4# qixiaobin0715


    in ('set #') 这个代码是什么意思啊? 我这边报环境变量错误。

TOP

显示所有变量名以#开头的变量。在3~4行之间加入set #,pause一下,试试

TOP

n先取10,试试

TOP

实际上这种效率不高,超过10000文件,最好想别的办法。

TOP

回复 9# qixiaobin0715

如果采取深度搜索的算法速度是否可以快一点,就是设置一个标志位,标志空的时候可以分配数字,
标志满的时候这个数字就不能分配。

TOP

所学有限,不懂,你可以试试嘛。成功的话可以分享一下。

TOP

回复 11# qixiaobin0715

我只会这个的递归写法,非递归我写不出来。
https://blog.csdn.net/weixin_39910711/article/details/100692318

TOP

  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
不要求连续,只要不重复就行

TOP

回复 13# newswan
解决了我的代码可能会出现重复数字的问题,但in ('set ')效率不高的问题还是个遗憾。

TOP

还有个问题,能存储多少变量?

TOP

返回列表