标题: [文本处理] 【已解决】BAT:如何提高多个文本数据交叉合并的运行速度 [打印本页]
作者: 思想之翼 时间: 2015-2-25 02:59 标题: 【已解决】BAT:如何提高多个文本数据交叉合并的运行速度
本帖最后由 思想之翼 于 2015-2-25 20:53 编辑
- @echo off
- for /l %%i in (1001 1 1210) do (
- set s=%%i
- setlocal enabledelayedexpansion
- set s=!s:~1!
- (for /f %%a in (!s!_1.txt) do (
- for /f %%b in (!s!_2.txt) do (
- set str=%%a%%b
- set n1=&set n2=
- for %%l in (1 2 3 4 5 6 7 8 9 0) do (
- if "!str:%%l=!" neq "!str!" (
- set n1=!n1!%%l
- ) else set n2=!n2!%%l
- )
- set n=!n1!A9876543210
- if "!n:~10,1!" == "3" (
- if not defined _!n1! (
- set _!n1!=0&echo,!n1!
- )
- ) else if "!n:~10,1!" == "7" (
- if not defined _!n2! (
- set _!n2!=0&echo,!n2!
- )
- )
- )
- ))>d:\数据2\!s!.txt
- endlocal
- )
- pause
复制代码
上述代码,是将2个文本的数据进行交叉合并,运行速度过于缓慢,若想提速,不知道如何优化,恳望得到帮助。
2个文本的数据进行交叉合并的具体过程如下(只需要最后的结果,分步过程不需要显示):
D:/数据1/内有若干txt文本:
001_1.txt
001_2.txt
002_1.txt
002_2.txt
...
210_1.txt
210_2.txt
每个txt文本内有多行数据,行数不定,每行数据在0-9之间,个数不定,最多7位数,各数字从小到大排列(数据0永远排列在最后一位)
比如:
35790
123579
1460
2456789
34567
1270
34568
257890
先将001_1.txt与001_2.txt内的数据进行合并,过程为:
001_1.txt内第1行数据与001_2.txt内的第1、2、3、4、5...行合并
001_1.txt内第2行数据与001_2.txt内的第1、2、3、4、5...行合并
...
001_1.txt内最后一行数据与001_2.txt内的第1、2、3、4、5..行合并
合并后每行数据,排序,去除重复数字,删除少于或多于7个数字的组合,只保留7个数字的组合。
比如合并后的数据为:79015914024945,去除重复数字,得到:1245790
保留下来的多行7个数字的组合,若有重复,去除重复。比如:
1236790
1236790
3456789
3456789
去除重复数据,得到:
1236790
3456789
每行数据取反集(0-9数值之间的未出现数),并将取反集后的数据从小到大排列(数据0永远排列在最后一位)。比如:
1245790的反集是:368
3456789的反集是:120
将这些数据竖排,写入D:/数据2/内的文本,文本名称为001.txt
以上是001_1.txt与001_2.txt的合并。之后,
将002_1.txt与002_2.txt合并,得到的数据,竖排,写入D:/数据2/内,文本名称为002.txt
将003_1.txt与003_2.txt合并,得到的数据,竖排,写入D:/数据2/内,文本名称为003.txt
...
将210_1.txt与210_2.txt合并,得到的数据,竖排,写入D:/数据2/内,文本名称为210.txt
作者: caruko 时间: 2015-2-25 12:16
快不了,你计算一下**生了多少条数据?
必须循环那么多次数。
作者: apang 时间: 2015-2-25 13:13
合并后每行数据,排序,去除重复数字,删除少于或多于7个数字的组合,只保留7个数字的组合。
比如合并后的数据为:79015914024945,去除重复数字,得到:1245790
为什么一定要这一步呢?直接取反集(79015914024945反集为368),然后找出不重复的3位数,有什么区别吗?
作者: apang 时间: 2015-2-25 13:17
本帖最后由 apang 于 2015-2-26 15:54 编辑
- Dim srcDir, dstDir, fso
- srcDir = "D:\数据1"
- dstDir = "D:\数据2"
- Set fso = CreateObject("Scripting.FileSystemObject")
- If Not fso.FolderExists(dstDir) Then fso.CreateFolder(dstDir)
-
- Dim i, f1, f2, f, objFile1, objFile2, s1, s2
- For i = 1001 to 1210
- f1 = srcDir & "\" & Mid(i, 2) & "_1.txt"
- f2 = srcDir & "\" & Mid(i, 2) & "_2.txt"
- If fso.FileExists(f1) and fso.FileExists(f2) Then
- f = dstDir & "\" & Mid(i, 2) & ".txt"
- Set objFile1 = fso.OpenTextFile(f1, 1)
- Set objFile2 = fso.OpenTextFile(f2, 1)
- s1 = RegEx(objFile1.ReadAll)
- s2 = RegEx(objFile2.ReadAll)
- objFile1.Close
- objFile2.Close
- fso.OpenTextFile(f, 2, true).Write CombineNum(s1, s2)
- End If
- Next
-
- MsgBox "OK"
-
- ''删除空白行
- Function RegEx(txt)
- Dim re
- Set re = New RegExp
- re.Pattern = "^(\s*\n)+"
- txt = re.Replace(txt, "")
- re.Pattern = "(\s*\n)+"
- re.Global = true
- RegEx = re.Replace(txt & vbLf, vbLf)
- End Function
-
- ''合并数据
- Function CombineNum(ByVal s1, ByVal s2)
- Dim ar1, ar2, j, k, n, s, m, str
- ar1 = Split(s1, vbLf)
- ar2 = Split(s2, vbLf)
- For j = 0 to UBound(ar1) - 1
- For k = 0 to UBound(ar2) - 1
- s = ""
- For n = 1 to 10
- m = n Mod 10
- If InStr(ar1(j) & ar2(k), m)=0 Then s = s & m
- Next
- If Len(s) = 3 and InStr(str, s) = 0 Then
- str = str & s & vbCrLf
- End If
- Next
- Next
- CombineNum = str
- End Function
复制代码
作者: 思想之翼 时间: 2015-2-25 20:49
回复 4# apang
是我弄错了,代码运行速度快了不少。谢谢!!!
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |