标题: [文本处理] 【已解决】BAT或VBS:满足条件求数值,并导入文本 [打印本页]
作者: 思想之翼 时间: 2015-11-6 22:43 标题: 【已解决】BAT或VBS:满足条件求数值,并导入文本
本帖最后由 思想之翼 于 2015-11-15 09:57 编辑
问题一、
一个五位数,比如56789,现在设定5是第1位,6是第2位,7是第3位,8是第4位,9是第5位
5位数各位置两两相加取尾数(比如56789的第1位+第2位:5+6=11,取尾数=1)有10种,即1+2、1+3、1+4、1+5、2+3、2+4、2+5、3+4、3+5、4+5
上述10种组合中,取不重复的4个为一组,比如 1+2、1+3、1+4、1+5 为一组,共有210个组合
这210个组合中,都有10000种形态
比如第1组
1+2可以=0123456789
1+3可以=0123456789
1+4可以=0123456789
1+5可以=0123456789
这样,第1组就可以组成0000-9999这10000种形态,分别是:
1+2=0
1+3=0
1+4=0
1+5=0
1+2=0
1+3=0
1+4=0
1+5=1
1+2=0
1+3=0
1+4=0
1+5=2
...
1+2=9
1+3=9
1+4=9
1+5=9
同样第2组、第3组...第210组,都有10000种形态
手工建立了名称为001-210这样210个文件夹,并在每个文件夹里手工建立了名称为00001.txt-10000.txt这样1万个文本。
∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷
现在,需要写一个批处理,在五位数 00000 - 99999 中
搜索符合第1组 1+2、1+3、1+4、1+5 为0000形态的数据
1+2=0
1+3=0
1+4=0
1+5=0
满足条件的五位数是 00000 19999 28888 37777 46666 55555 64444 73333 82222 91111
将其写入 D:/数据/001/00001.txt(数据横排,末尾加回车符;没有数据,则写入空)
搜索符合第1组 1+2、1+3、1+4、1+5 0001形态的数据
1+2=0
1+3=0
1+4=0
1+5=1
满足条件的五位数是 00001 19990 28889 37778 46667 55556 64445 73334 82223 91112
将其写入 D:/数据/001/00002.txt
...
搜索符合第1组 1+2、1+3、1+4、1+5 9999形态的数据
1+2=9
1+3=9
1+4=9
1+5=9
满足条件的五位数是 09999 18888 27777 36666 45555 54444 63333 72222 81111 90000
将其写入 D:/数据/001/10000.txt
∷∷∷∷∶∶∶∶∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷
搜索符合第2组1+2、1+3、1+4、2+3 0000形态的数据
1+2=0
1+3=0
1+4=0
2+3=0
满足条件的五位数是 00000 00001 00002 00003 00004 00005 00006 00007 00008 00009 55550 55551 55552 55553 55554 55555 55556 55557 55558 55559
将其写入 D:/数据/002/00001.txt(数据横排,末尾加回车符;没有数据,则导入空文本)
搜索符合第2组1+2、1+3、1+4、2+3 0001形态的数据
1+2=0
1+3=0
1+4=0
2+3=1
没有满足条件的五位数,就将空文本写入 D:/数据/002/00002.txt
...
搜索符合第2组1+2、1+3、1+4、2+3 9999形态的数据
1+2=9
1+3=9
1+4=9
2+3=9
没有满足条件的五位数,就将空文本写入 D:/数据/002/10000.txt
......
∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷
搜索符合第210组 2+5、3+4、3+5、4+5 0000形态的数据
2+5=0
3+4=0
3+5=0
4+5=0
满足条件的五位数是 00000 05555 10000 15555 20000 25555 30000 35555 40000 45555 50000 55555 60000 65555 70000 75555 80000 85555 90000 95555
将其写入 D:/数据/210/00001.txt(数据横排,末尾加回车符;没有数据,则导入空文本)
搜索符合第210组 2+5、3+4、3+5、4+5 0001形态的数据
2+5=0
3+4=0
3+5=0
4+5=1
没有满足条件的五位数,就将空文本写入 D:/数据/210/00002.txt
......
搜索符合第210组 2+5、3+4、3+5、4+5 9999形态的数据
2+5=9
3+4=9
3+5=9
4+5=9
没有满足条件的五位数,就将空文本写入D:/数据/210/10000.txt
这样的代码如何写?
∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷
问题二、
5位数各位置两两相减的绝对值,(比如56789的第1位、第2位相减的绝对值,即|5-6|=1)也有10种
即|1-2|、|1-3|、|1-4|、|1-5|、|2-3|、|2-4|、|2-5|、|3-4|、|3-5|、|4-5|
上述10种组合中,取不重复的4个为一组,比如|1-2|、|1-3|、|1-4|、|1-5|为一组,共有210个组合
这210个组合中,同样每组都有10000种可能
欲进行上述过程,搜索出210个组合中0000-9999形态的数据,并分别写入对应的文本
问题一的代码修改什么地方?
作者: terse 时间: 2015-11-7 00:14
本帖最后由 terse 于 2015-11-7 02:31 编辑
- @ECHO OFF&setlocal enabledelayedexpansion
- md "D:/数据/002/" 2>nul
- for /l %%i in (0,1,8) do set /a _%%i=%%i+1
- for /l %%s in (100000,1,199999) do (
- set $n=&set $m=&set str=%%s
- for /l %%i in (1,1,4) do (
- for /l %%j in (!_%%i!,1,5) do (
- set /a "n=(!str:~%%i,1!+!str:~%%j,1!)%%10"
- set /a "m=(!str:~%%i,1!-!str:~%%j,1!)%%10"
- set $n=!$n!!n!
- set $m=!$m!!m:-=!
- )
- )
- for /l %%a in (0,1,6) do (
- for /l %%b in (!_%%a!,1,9) do (
- for /l %%c in (!_%%b!,1,9) do (
- for /l %%d in (!_%%c!,1,9) do (
- for %%n in (n m) do (
- set /a %%n=10!$%%n:~%%a,1!!$%%n:~%%b,1!!$%%n:~%%c,1!!$%%n:~%%d,1!+1
- if not defined !str!#!%%n! (
- set !str!#!%%n!=0
- >> "D:/数据/002/!%%n:~-5!.txt" echo;!str:~1!
- )
- )
- )
- )
- )
- )
- )
- PAUSE
复制代码
作者: terse 时间: 2015-11-7 02:31
回复 3# 思想之翼
已修改 是这个意思吗
作者: 思想之翼 时间: 2015-11-7 04:19
本帖最后由 思想之翼 于 2015-11-8 01:28 编辑
回复 4# terse
感谢!
但不是想要的结果。
简要说明:
一、5位数各位置两两相加取尾数,有10种位置组合:12、13、14、15、23、24、25、34、35、45
二、上述10种位置组合,取不重复4个为一组,有210种组合:
12/13/14/15 12/13/14/23 ....... 24/25/35/45 24/34/35/45 25/34/35/45
三、需要计算的是:
先看第1个组合 12/13/14/15
1+2=0/1+3=0/1+4=0/1+5=0(即0000组合)
1+2=0/1+3=0/1+4=0/1+5=1(即0001组合)
...
1+2=9/1+3=9/1+4=9/1+5=9(即9999组合)
将满足上述0000组合的五位数,写入D:/数据/001/00001.TXT
将满足上述0001组合的五位数,写入D:/数据/001/00002.TXT
...
将满足上述9999组合的五位数,写入D:/数据/001/10000.TXT
第2个组合 12/13/14/23
1+2=0/1+3=0/1+4=0/2+3=0(即0000组合)
1+2=0/1+3=0/1+4=0/2+3=1(即0001组合)
...
1+2=9/1+3=9/1+4=9/2+3=9(即9999组合)
将满足上述0000组合的五位数,写入D:/数据/002/00001.TXT
将满足上述0001组合的五位数,写入D:/数据/002/00002.TXT
...
将满足上述9999组合的五位数,写入D:/数据/002/10000.TXT
以此类推至第210个组合 25/34/35/45
2+5=0/3+4=0/3+5=0/4+5=0(即0000组合)
2+5=0/3+4=0/3+5=0/4+5=1(即0001组合)
...
2+5=9/3+4=9/3+5=9/4+5=9(即9999组合)
将满足上述0000组合的五位数,写入D:/数据/210/00001.TXT
将满足上述0001组合的五位数,写入D:/数据/210/00002.TXT
...
将满足上述9999组合的五位数,写入D:/数据/210/10000.TXT
作者: 依山居 时间: 2015-11-7 09:08
本帖最后由 依山居 于 2015-11-7 10:21 编辑
我都没看明白是什么意思就能把代码写出来了,你已经能把代码写出来了。厉害。
作者: pcl_test 时间: 2015-11-7 11:52
察,没明白00000-99999是依据什么得出来的
作者: 思想之翼 时间: 2015-11-7 12:09
本帖最后由 思想之翼 于 2015-11-7 12:23 编辑
回复 6# pcl_test
感谢关注!
00000-99999是五位数的全组合:一个五位数,第1-5位可以是0123456789,那么5个0123456789,全组合就是00000-99999这10万个数值
在五位数全组合里
当第1位+第2位的尾数=0
且第1位+第3位的尾数=0
且第1位+第4位的尾数=0
且第1位+第5位的尾数=0
符合上述条件的五位数是00000 19999 28888 37777 46666 55555 64444 73333 82222 91111
将该数值导入D:/数据/001/00001.txt
在五位数全组合里
当第1位+第2位的尾数=0
且第1位+第3位的尾数=0
且第1位+第4位的尾数=0
且第1位+第5位的尾数=1
符合上述条件的五位数是00001 19990 28889 37778 46667 55556 64445 73334 82223 91112
将该数值导入D:/数据/001/00002.txt
以此类推,直至
当第1位+第2位的尾数=9
且第1位+第3位的尾数=9
且第1位+第4位的尾数=9
且第1位+第5位的尾数=9
这是第一组的1万个组合
依次还有209组1万个组合
作者: B魔方大人 时间: 2015-11-7 14:47
本帖最后由 B魔方大人 于 2015-11-8 04:13 编辑
回复 13# 思想之翼
修改后如下?同时post出我的疑问,表示不懂。另外,以下代码稍显笨拙,望能人修改。- '我举个例子,比如五位数12345
- '取两两和的个位数,共十个。
- ' 第1位 + 第2位=3
- ' 第1位 + 第3位=4
- ' 第1位 + 第4位=5
- ' 第1位 + 第5位=6
- ' 第2位 + 第3位=5
- ' 第2位 + 第4位=6
- ' 第2位 + 第5位=7
- ' 第3位 + 第4位=7
- ' 第3位 + 第5位=8
- ' 第4位 + 第5位=9
-
- '十个数中取每4个为一组,210种组合。
- ' 第一组保存001/*.txt
- ' 第二组保存002/*.txt
- ' 依次……
-
- ' 从你的例子中看出
- ' 第一组为:十个数中1234位,保存到3457.txt
- ' 第1位 + 第2位=3
- ' 第1位 + 第3位=4
- ' 第1位 + 第4位=5
- ' 第1位 + 第5位=6
- ' 存入0001/03456.txt
- ' 第二组为:十个数中1235位,保存到3456.txt
- ' 第1位 + 第2位=3
- ' 第1位 + 第3位=4
- ' 第1位 + 第4位=5
- ' 第2位 + 第3位=5
- ' 存入0002/3455.txt
- ' 第三组为:十个数中1236位,保存到3457.txt
- ' 第1位 + 第2位=3
- ' 第1位 + 第3位=4
- ' 第1位 + 第4位=5
- ' 第2位 + 第4位=6
- ' 存入0003/3456.txt
- ' 依次……
-
- '以上是单独一个五位数的处理方式。
- '循环一次带入一个数,分别处理。
- '组文件夹与txt文件保存到当前文件夹,非D:\数据\
- '最后一句wsh.echo o测试用,可删。
- '你所说的,每个五位数,分别对应一组数据下的10000个txt,我表示不懂。
-
-
- Dim Num,M(),k,Num1,Num2,sl,fso,ws
- Set fso = CreateObject("scripting.filesystemobject")
- sl="0000"
- For i=0 To 99999
- If Len(CStr(i))<5 Then Num= Mid(sl,1,5-Len(CStr(i))) &CStr(i)
- Call tex(Num)
- Next
- 'Call tex("29999")
- Sub tex(strNum)
- Dim i,j,k,l,o,str_,p
- For i=1 To Len(strNum)
- For j=i+1 To Len(strNum)
- k=k+1:ReDim Preserve M(k)
- M(k) = CStr((CInt(Mid(strnum,i,1)) + CInt(Mid(strnum,j,1))) mod 10)
- Next
- Next
- For i=1 To ubound(m)
- For j=i+1 To ubound(m)
- For k=j+1 To ubound(m)
- For l=k+1 To ubound(m)
- If i<>j And i<>k And i<>l And j<>k And j<>l And k<>l then
- o=o+1:If Len(CStr(o))<3 Then p = Mid(sl,1,3-Len(CStr(o))) &CStr(o)
- ' str_ = str_ & "五位数:" & strNum &Chr(13)&chr(10)
- ' str_ = str_ & "尾数和的个位:" & Join(M) &Chr(13)&chr(10)
- ' str_ = str_ & "第" & p & "组取:" & i & j & k & l &"位" &Chr(13)&chr(10)
- ' str_ = str_ & "保存到:" & "D:\数据\" & p & "\0" & CStr(CInt(M(i) & m(j) & m(k) & m(l))+1) &".txt" &Chr(13)&chr(10)
- ' wsh.echo str_:str_=""
- If fso.FolderExists(p)=False Then fso.CreateFolder(p)
- Set f=fso.OpenTextFile(p & "\0" & CStr(CInt(M(i) & m(j) & m(k) & m(l))+1) &".txt",8,True)
- f.WriteLine strNum
- f.Close
- End if
- Next
- Next
- Next
- Next
- wsh.echo o
- End Sub
复制代码
作者: terse 时间: 2015-11-7 19:26
回复 4# 思想之翼
是我没明白你意思 还是你表达不清呢?
我说一下我代码过程
首先 将00000 - 99999 五位数 分别取10个组合的和(如第一位加第二位... 一直至第四位加第五位, 这样得到10个组合的和, 得到10个数,
前面得到的10个数,再分别选4个数排列(10选4)即210个排列,然后将这个数的210个不重复的排列写入文件,如28888 含有的排列0000 就将28888写入00001.txt
你的表达我不是很清楚,也许我的表达 你也不清楚,
给个图说明一下
作者: 依山居 时间: 2015-11-7 19:52
哈哈。猜啊猜。
实际你们这些伸手党问的问题,处理逻辑都不复杂,学门语言用不了多少时间。你们自己就是不愿意自己学。
作者: B魔方大人 时间: 2015-11-7 20:32
回复 10# 依山居
本来挺简单的逻辑,很容易被题主带入他设定好的思维中!😄
作者: 思想之翼 时间: 2015-11-7 21:26
本帖最后由 思想之翼 于 2015-11-7 23:14 编辑
回复 9# terse
感谢详细说明。
您的思路我明白了。您的代码,将10选4组成210个组合后,然后将这个数的210个不重复的排列写入文件,如28888 含有的排列0000 就将28888写入00001.txt
问题就出在这。28888 含有排列0000,这是第1个组合里的排列0000,就需要将28888写入/001/00001.txt
我的初衷是,从单个条件考虑,符合某个条件的数值,就写入特意为这个条件建立的文件夹及文本。
210个组合,需要建立210个文件夹,210个文件夹内都需要建立00001.txt - 10000.txt的文本。
比如:
符合第一个组合的第一个条件
1+2=0
1+3=0
1+4=0
1+5=0
其数值是 00000 19999 28888 37777 46666 55555 64444 73333 82222 91111
就只将这组数值写入001文件夹内的00001.txt
符合第二个组合的第一个条件
1+2=0
1+3=0
1+4=0
2+3=0
其数值是 00000 00001 00002 00003 00004 00005 00006 00007 00008 00009
55550 55551 55552 55553 55554 55555 55556 55557 55558 55559
就只将这组数值写入002文件夹内的00001.txt
这样分组写入特定文本的数据,有重复。比如001文件夹内00001.txt 中有00000,002文件夹内00001.txt中也有00000
作者: 思想之翼 时间: 2015-11-7 22:33
回复 8# B魔方大人
感谢!
代码运行时不时弹出确认按钮,也没有任何运算结果。
作者: wankoilz 时间: 2015-11-7 23:08
哈哈。猜啊猜。
实际你们这些伸手党问的问题,处理逻辑都不复杂,学门语言用不了多少时间。你们自己就是 ...
依山居 发表于 2015-11-7 19:52
兄弟有点过激了...
作者: 依山居 时间: 2015-11-8 01:44
回复 14# wankoilz
一点都没有。伸手党一直都是这些人。
我从09年到15年计算机水平没有进步过。不过解决问题大多靠自己查资料可以解决,不至于开口就问人要代码。
我最近贴的代码都是一边查资料一边写出来的。可见不难。水平要求并不高。
作者: terse 时间: 2015-11-8 02:00
- @ECHO OFF&setlocal enabledelayedexpansion
- for /l %%i in (0,1,9) do set /a _%%i=%%i+1
- for /l %%i in (1,1,4) do (
- for /l %%j in (!_%%i!,1,5) do (
- set /an+=1
- set "$!n!=%%i %%j"
- )
- )
- for /l %%i in (0,1,9) do (
- for /l %%j in (0,1,9) do (
- set /a "$%%i_%%j=(%%i+%%j)%%10"
- )
- )
-
- for /l %%i in (1001,1,1210) do (
- set n=%%i
- md "D:/数据/!n:~1!" 2>nul
- )
- set n=1000
- for /l %%a in (1,1,7) do (
- for /l %%b in (!_%%a!,1,10) do (
- for /l %%c in (!_%%b!,1,10) do (
- for /l %%d in (!_%%c!,1,10) do (
- set /an+=1
- for /l %%e in (100000,1,199999) do (
- set s=%%e
- for /f "tokens=1-8" %%1 in ("!$%%a! !$%%b! !$%%c! !$%%d!") do (
- for /f "tokens=1-4" %%i in ("!s:~%%1,1!_!s:~%%2,1! !s:~%%3,1!_!s:~%%4,1! !s:~%%5,1!_!s:~%%6,1! !s:~%%7,1!_!s:~%%8,1!") do (
- set /a t=10!$%%i!!$%%j!!$%%k!!$%%l!+1
- >>"D:/数据/!n:~1!/!t:~1!.txt" set /p =!s:~1! <nul
- )
- )
- )
- )
- )
- )
- )
- pause
复制代码
作者: 思想之翼 时间: 2015-11-8 03:03
本帖最后由 思想之翼 于 2015-11-8 05:31 编辑
回复 16# terse
感谢您的帮助!
代码正在测试。有些问题还需您的帮助:
1、发现写入的文本数据末尾,没有添加回车符。
2、部分条件形态无数值,没有导入空文本。如果事后添加00001.txt-10000.txt之间未出现序号的空文本,这样的代码如何写?
3、如果是两两相减取绝对值,下句如何修改?
set /a "$%%i_%%j=(%%i+%%j)%%10"
作者: terse 时间: 2015-11-9 11:50
回复 17# 思想之翼
问题1 问题2
在代码最后 加上- for /l %%i in (1001,1,1210) do (
- set n=%%i
- for /l %%j in (100001,1,110000) do (
- set s=%%j
- >>"D:/数据/!n:~1!/!s:~1!.txt" echo;
- )
- )
复制代码
问题3 将第11行代码 替换为- set /a "n=%%i-%%j,$%%i_%%j=(n>>31|1)*n"
复制代码
作者: wankoilz 时间: 2015-11-9 17:12
本帖最后由 wankoilz 于 2015-11-9 17:15 编辑
练习awk!
感觉效率是个问题,100000个五位数共2千一百万个组合,仅仅是装入数组就花了34秒
如果再不停的写入文件,估计够呛。
以下代码针对第一个问题,仅仅是将2千一百万个组合装入数组,并没有实现写入文本,因为那样太慢,只当练手。- # & cls & setlocal enabledelayedexpansion
- # & cls & echo !time! & echo; | gawk -f %0 >con & echo !time! & pause & exit
-
- END{
- #将100000个“五位数”的共21000000个四位组合装入数组
- s="0123456789"
- for(i=1;i<=length(s);i++){arr_num[i]=substr(s,i,1)}
- for(a=0;a<=9;a++){
- for(b=0;b<=9;b++){
- for(c=0;c<=9;c++){
- for(d=0;d<=9;d++){
- for(e=0;e<=9;e++){
- str_5=a""b""c""d""e
- for(x=1;x<=5;x++){arr_str_5[x]=substr(str_5,x,1)}
- str_10=""
- for(f=1;f<=5;f++){
- for(g=f+1;g<=5;g++){
- remainder=(arr_str_5[f]+arr_str_5[g]) % 10
- str_10=str_10""remainder
- }
- }
- count_210=0;str_4=""
- for(x=1;x<=10;x++){arr_str_10[x]=substr(str_10,x,1)}
- for(m=1;m<=10;m++){
- for(n=m+1;n<=10;n++){
- for(o=n+1;o<=10;o++){
- for(p=o+1;p<=10;p++){
- count_210+=1
- str_4=arr_str_10[m]""arr_str_10[n]""arr_str_10[o]""arr_str_10[p]
- arr_rem_com[str_5][count_210]=str_4
- }
- }
- }
- }
- }
- }
- }
- }
- }
- #测试查看19999的210个组合情况
- for(i=1;i<=210;i++){
- print arr_rem_com[19999][i]
- }
- }
复制代码
gawk 4.1.0 下载地址:http://www.bathome.net/viewthread.php?tid=21366&highlight=gawk
为什么代码显示出的缩进会这么大....实际没这么夸张
作者: 思想之翼 时间: 2015-11-9 19:15
回复 18# terse
感谢您的热心帮助!
在末尾添加如下代码 可以在001-210文件夹里 添加00001-10000之间未出现名称的空文本 然后全部文本添加回车符
如果要在001-210文件夹里所有文本数据末尾先添加回车符 然后再在001-210文件夹里添加00001-10000之间未出现名称的空文本,下列代码如何修改?
for /l %%i in (1001,1,1210) do (
set n=%%i
for /l %%j in (100001,1,110000) do (
set s=%%j
>>"D:/数据/!n:~1!/!s:~1!.txt" echo;
)
)
作者: terse 时间: 2015-11-9 19:18
回复 20# 思想之翼
已经添加
作者: 思想之翼 时间: 2015-11-9 19:51
回复 21# terse
您给出的代码,是先添加未出现名称的空文本,再在所有文本中添加回车符,这样先前添加的空文本,也加了回车符
如果先在文本数据末尾添加回车符 ,再添加未出现名称的空文本,您给出的代码如何修改?
作者: terse 时间: 2015-11-9 21:48
回复 22# 思想之翼
那就加个判断- if exist "D:/数据/!n:~1!/!s:~1!.txt" (>>"D:/数据/!n:~1!/!s:~1!.txt" echo;) else >"D:/数据/!n:~1!/!s:~1!.txt" echo;
复制代码
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |