标题: [文本处理] 【已解决】BAT或VBS:如何将七个位置进行全组合 [打印本页]
作者: 思想之翼 时间: 2015-11-17 13:15 标题: 【已解决】BAT或VBS:如何将七个位置进行全组合
本帖最后由 思想之翼 于 2015-11-18 11:04 编辑
- @echo off&setlocal enabledelayedexpansion
- for %%a in (0 1 2 3 4 5 6) do (
- for %%b in (0 1 2 3 4 5 6) do (
- for %%c in (0 1 2 3 4 5 6) do (
- for %%d in (0 1 2 3 4 5 6) do (
- for %%e in (0 1 2 3 4 5 6) do (
- for %%f in (0 1 2 3 4 5 6) do (
- for %%g in (0 1 2 3 4 5 6) do (
- set var=%%a%%b%%c%%d%%e%%f%%g
- if not defined !var! (set !var!=m & echo !var!)
- )
- )
- )
- )
- )
- )
- )
- pause>nul
复制代码
上述代码,将0123456这七个数据全组合,即第一位至第七位都选择七个数据 0 1 2 3 4 5 6
现在需要按位置进行全组合:
比如有数据1230401(数字有重复)
第一位可以选择七个数据:1、2、3、0、4、0、1
第一位如果选择了1,那么第二位只能在余下的六个数据 2、3、0、4、0、1中选择
第一位如果选择了1,第二位选择了2,那么第三位只能在余下的五个数据 3、0、4、0、1中选择
......
这样将1230401按位置进行全组合,有7*6*5*4*3*2*1=5040种可能。
现在如果文本中有数据:
0987664
1234555
6570030
每行数据都按位置进行全组合,分别得到一组5040个数据。将这3组数据合并写入新建的文本,这样的代码如何写?恳望得到帮助。
作者: ads350668398 时间: 2015-11-17 14:38
@echo off&setlocal enabledelayedexpansion&title
set L1=01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
for /d %%a in (%l1%) do (
for /d %%b in (%l1%) do (
if %%b GTR %%a (
for /d %%c in (%l1%) do (
if %%c GTR %%b (
for /d %%d in (%l1%) do (
if %%d GTR %%c (
for /d %%e in (%l1%) do (
if %%e GTR %%d (
for /d %%f in (%l1%) do (
if %%f GTR %%e (
echo %%a %%b %%c %%d %%e %%f >>500.txt
)
)
)
)
)
)
)
)
)
)
)
)
你要的是不是这个#024 转
作者: 思想之翼 时间: 2015-11-17 16:55
本帖最后由 思想之翼 于 2015-11-17 17:46 编辑
回复 2# ads350668398
感谢您。但不符合我的思路。
作者: aa77dd@163.com 时间: 2015-11-17 20:33
- @echo off
-
- >outfile.txt cd.
-
- set "dic=a b c d e f g "
- set "alphabet=%dic: =%"
-
- call :proc "%dic%" > ttt
-
- for %%t in (
- 0987664
- 1234555
- 6570030
- ) do (
- clip < ttt
-
- setlocal enabledelayedexpansion
-
- set "rep="
-
- for /L %%i in (0 1 6) do (
-
- set "str=%%t"
-
- set "rep=!rep!.replace(/!alphabet:~%%i,1!/g,'!str:~%%i,1!')"
- )
-
- mshta.exe "javascript:s=clipboardData.getData('text')!rep!;fso=new ActiveXObject("Scripting.FileSystemObject");f=fso.OpenTextFile("tempfile",2,true);f.Write(s);f.Close();close();"
-
- copy outfile.txt /b + tempfile /b outfile.txt /b
- )
- pause
-
- exit
-
-
- :proc
- (
- if "%~1"=="" echo;%~2& exit /b
-
- for %%i in (%~1) do (
-
- setlocal enabledelayedexpansion
-
- set oo=%~2%%i
-
- set dic=%~1
-
- call :proc "!dic:%%i =!" "!oo!"
-
- endlocal
- )
- exit /b
- )
复制代码
作者: yiwuyun 时间: 2015-11-17 21:40
- if ($true){}# == ($true){}# goto ___yiwuyun
- <#BeginBatOperation#
- :___yiwuyun
- @echo off&setlocal&cls
- (echo $yiwuyun_fileName="%~f0"&echo $strPath="%~dp0"&type "%~f0")|powershell -command -
- exit/b 0
- #EndBatOperation#>
-
- <#StartPowerShell#>
- Function OutString{
- param($Array)
- $x=0;
- for($i=0;$i -lt 7;$i++){
- for($j=0;$j -lt 7;$j++){
- if($i -eq $j){
- continue;
- }else{
- for($k=0;$k -lt 7;$k++){
- if($i -eq $k -or $j -eq $k){
- continue;
- }else{
- for($l=0;$l -lt 7;$l++){
- if($i -eq $l -or $j -eq $l -or $k -eq $l){
- continue;
- }else{
- for($m=0;$m -lt 7;$m++){
- if($i -eq $m -or $j -eq $m -or $k -eq $m -or $l -eq $m){
- continue;
- }else{
- for($n=0;$n -lt 7;$n++){
- if($i -eq $n -or $j -eq $n -or $k -eq $n -or $l -eq $n -or $m -eq $n){
- continue;
- }else{
- for($o=0;$o -lt 7;$o++){
- if($i -eq $o -or $j -eq $o -or $k -eq $o -or $l -eq $o -or $m -eq $o -or $n -eq $o){
- continue;
- }else{
- $x++;
- "$x`:$($Array[$i])$($Array[$j])$($Array[$k])$($Array[$l])$($Array[$m])$($Array[$n])$($Array[$o])";
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- gc 1.txt|%{OutString -Array $_;}
-
- <#EndPowerShell#>
复制代码
作者: 思想之翼 时间: 2015-11-17 22:03
回复 4# aa77dd@163.com
感谢您的帮助!测试了一下,结果正确。
代码若能批量读取文本数据,就臻于完美了。比如:
批量读取待组合的文本在D:/数据1/内,名称分别是0001.txt 0002.txt 0003.txt......0210.txt(文本内数据竖排,每行一数据)
批量组合后的文本写入D:/数据2/内,名称分别是0001.txt 0002.txt 0003.txt......0210.txt
作者: aa77dd@163.com 时间: 2015-11-17 22:42
回复 6# 思想之翼
由于用到了剪贴板, 所以运行期间不要让剪贴板内容变化- @echo off
-
- set "dic=a b c d e f g "
- set "alp=%dic: =%"
-
- call :proc "%dic%" > ttt
-
- clip < ttt
-
-
- setlocal enabledelayedexpansion
-
- for /L %%i in (10001 1 10210) do (
-
- set "fn=%%i"
-
- > D:\数据2\!fn:~-4!.txt cd.
-
- for /f %%t in (D:\数据1\!fn:~-4!.txt) do (
-
- set "str=%%t"
-
- set "rep="
-
- for /L %%i in (0 1 6) do set "rep=!rep!.replace(/!alp:~%%i,1!/g,'!str:~%%i,1!')"
-
- mshta.exe "javascript:s=clipboardData.getData('text')!rep!;fso=new ActiveXObject("Scripting.FileSystemObject");f=fso.OpenTextFile("tempfile",2,true);f.Write(s);f.Close();close();"
-
- copy D:\数据2\!fn:~-4!.txt /b + tempfile /b D:\数据2\!fn:~-4!.txt /b
- )
- )
-
- pause
-
- exit
-
-
- :proc
- (
- if "%~1"=="" echo;%~2& exit /b
-
- for %%i in (%~1) do (
-
- setlocal enabledelayedexpansion
-
- set oo=%~2%%i
-
- set dic=%~1
-
- call :proc "!dic:%%i =!" "!oo!"
-
- endlocal
- )
- exit /b
- )
复制代码
作者: 思想之翼 时间: 2015-11-17 23:05
本帖最后由 思想之翼 于 2015-11-18 01:48 编辑
回复 7# aa77dd@163.com
感谢!
数据多时,出现“已达到最大setlocal递归层”。
作者: CrLf 时间: 2015-11-18 00:55
绝不告诉你们有这个经典算法:
http://www.bathome.net/redirect. ... 11959&pid=76175
作者: terse 时间: 2015-11-18 01:57
- @echo off&setlocal enabledelayedexpansion
- set /a "i=1,n=6"
- for /l %%i in (0,1,%n%) do (
- set /a "i*=%%i+1,#%%i=%%i+1"
- set "J!#%%i!=!i!"
- )
- set /ai-=1
- pushd "d:\数据1\"
- for /f "delims=" %%a in ('dir /a-d /b "*.txt"') do (
- (for /f "delims=" %%b in (%%a) do (
- set "s=s%%b"
- for /l %%i in (0,1,%i%) do (
- setlocal
- set M=%%i
- for /l %%j in (%n%,-1,1) do (
- set /a "i=M/J%%j,M=%%i%%J%%j"
- set /a "#%%j=#!i!,#!i!=!#%%j!"
- )
- for /l %%i in (%n%,-1,0) do for %%j in (!#%%i!) do set $=!$!!s:~%%j,1!
- echo;!$!
- endlocal
- )
- ))>"d:\数据2\%%a"
- )
- pause
复制代码
作者: WHY 时间: 2015-11-18 14:43
本帖最后由 WHY 于 2015-11-18 15:24 编辑
我贴个VBS- Dim strSrcDir, strDstDir, fso, i, strFile, objFile, strLine, s
- strSrcDir = "D:\数据1"
- strDstDir = "D:\数据2"
- Set fso = CreateObject("Scripting.FileSystemObject")
- If Not fso.FolderExists(strDstDir) Then fso.CreateFolder(strDstDir)
-
- For i = 1 To 210
- strFile = Right(i+10000, 4) & ".txt"
- If fso.FileExists(strSrcDir & "\" & strFile) Then
- Set objFile = fso.OpenTextFile(strSrcDir & "\" & strFile, 1)
- While Not objFile.AtEndOfStream
- strLine = Trim(objFile.ReadLine)
- If strLine <> "" Then
- s = ""
- Call getFullArray(strLine, "")
- fso.OpenTextFile(strDstDir & "\" & strFile, 8, True).Write(s)
- End If
- Wend
- objFile.Close : Set objFile = Nothing
- End If
- Next
-
- Set fso = Nothing
- MsgBox "成功!"
-
- Sub getFullArray(ByRef s1, ByRef s2)
- Dim j
- For j = 1 To Len(s1)
- Call getFullArray(Left(s1, j-1) & Mid(s1, j+1), s2 & Mid(s1, j, 1))
- Next
- If Len(s1) = 0 Then s = s + s2 + vbCrLf : Exit Sub
- End Sub
复制代码
作者: wankoilz 时间: 2015-11-18 16:05
练习awk!- # & cls & (for /f "delims=" %%a in ('dir/b/s d:\数据1\*.txt') do @gawk -f %0 %%a) & pause & exit
- #求全排列使用的“插入法”
- #注意:split函数产生空值的问题
- #如:split("a,",arr,","),生成的arr有两个元素,第二个元素为空值
- {
- #显示进度
- print "processing "FILENAME" row "NR
- s=$0;perm=""
- for(i=1;i<=length(s);i++){
- split(perm,arr,",");perm=""
- #开始perm为空,得到的arr也为空,为避免for(j in arr)不执行,初始一个空值
- if(length(arr)==0){arr[1]=""}
- word=substr(s,i,1)
- for(j in arr){
- for(k=0;k<=length(arr[j]);k++){
- tmp=substr(arr[j],1,k)""word""substr(arr[j],k+1,length(arr[j])-k)
- perm=perm""tmp","
- }
- }
- #去掉最后的分隔符",",以免split函数产生空值
- perm=substr(perm,1,length(perm)-1)
- }
- #将逗号换成换行符
- gsub(/,/,"\n",perm)
- #获得当前处理的文件名
- split(FILENAME,path,"\\")
- print perm >> "d:\\数据2\\"path[length(path)]
- }
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |