标题: [文本处理] 文件名乱序排列批处理如何写(部分解决了)? [打印本页]
作者: 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
- >>> import random
- >>> a = list(range(1,20))
- >>> a
- [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
- >>> random.shuffle(a)
- >>> a
- [5, 14, 4, 6, 1, 12, 11, 13, 7, 3, 17, 10, 16, 8, 18, 19, 15, 9, 2]
- >>>
复制代码
作者: qixiaobin0715 时间: 2021-5-24 15:59
笨办法,如果文件数为n,取随机数字:- @echo off
- setlocal enabledelayedexpansion
- for /l %%a in (1,1,!n!) do set #!random!=%%a
- for /f "tokens=2 delims==" %%i in ('set #') do echo,%%i
- 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
- for /f "usebackq delims=" %%a in (`dir /b *.txt`) do (
- call :f "%%a"
- )
- for /f "usebackq tokens=2 delims==" %%a in (`set _`) do (
- echo %%a
- )
-
- goto :END
-
- :f
- set n=%random%
- if defind _%n% goto :f
- set _%n%=%~1
- 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
- @echo off
-
- for /f "usebackq delims=" %%a in (`dir /b *.txt`) do (
- call :f "%%a"
- )
- for /f "usebackq tokens=2 delims==" %%a in (`set _`) do (
- echo %%a
- )
-
- goto :END
-
- :f
- set n=%random%
- if defined _%n% goto :f
- set _%n%=%~1
- goto :eof
-
- :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
上面帖子里有现成的- @echo off & cd /d "%~dp0"
- call :getSingleRandom 40 100 20
- echo 随机字符串:%randomStr%
- for %%i in (%randomStr%) do echo %%i
- pause&exit
-
- REM 方法:获取单一随机数 call :getSingleRandom 最小值 最大值 随机数个数
- :getSingleRandom
- set "n=%~3"
- set "randomStr= "
- :loop
- set /a "a=%random%%%(%~2-%~1+1)+%~1"
- call set "newStr=%%randomStr:%a%=%%"
- if "%newStr%" equ "%randomStr%" (
- set "randomStr=%randomStr% %a%"
- set /a "n-=1"
- )
- if "%n%" neq "0" goto :loop
- 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
用数字测试可以。- @echo off
- for /l %%a in (40,1,100) do (
- call :f %%a
- )
- for /f "usebackq tokens=2 delims==" %%i in (`set #`) do (
- echo %%i
- )
- pause
- goto :eof
-
- :f
- set n=%random%
- if defined #%n% goto :f
- set #%n%=%~1
- goto :eof
- pause
复制代码
作者: newswan 时间: 2021-5-25 12:54
回复 23# netdzb
下载你发的,已测试,没有问题
作者: newswan 时间: 2021-5-25 12:56
1到10的随机排列- @echo off
- setlocal enableDelayedExpansion
-
- rem 1..10
- for /l %%a in (1,1,10) do (
- set _%%a=x%%a
- )
- echo sequences
- for /l %%a in (1,1,10) do (
- echo !_%%a!
- )
-
- rem 随机
- for /l %%a in (1,1,9) do (
- call :f %%a 10
- )
- echo random
- for /l %%a in (1,1,10) do (
- echo !_%%a!
- )
- goto :END
-
- :f
- set /a n=%random%%%(%2-%1+1)+%1
- if %n%==%1 goto :eof
- set t=!_%n%!
- set _%n%=!_%1!
- set _%1=%t%
- goto :eof
-
-
- :END
复制代码
作者: went 时间: 2021-5-25 12:58
我觉得你可以用powershell,win7也支持- powershell -c "40..100 | Sort-Object {return Get-Random}"
复制代码
作者: went 时间: 2021-5-25 13:01
只取10个- 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 |