标题: [文本处理] 【已解决】BAT:文本数据如何三三合并 [打印本页]
作者: 思想之翼 时间: 2015-2-22 15:20 标题: 【已解决】BAT:文本数据如何三三合并
本帖最后由 思想之翼 于 2015-2-23 19:30 编辑
D:/数据/内有若干txt文本,每个文本内有24行数据,格式为:
120
456
149
689
259
248
370
158
147
123
246
156
367
257
890
345
258
579
127
150
189
780
346
290
欲批量对各文本进行如下处理:
1、先处理第一个文本
任意提取文本内的三行数据进行合并,共有2024个组合
比如 第一、二、三行数据 120、456 、149 合并成 120456149,再去除重复的数字,并从小到大排列(数据0永远排列在最后),得到 1245690
若提取的三行数据相同,比如 570 、570 、570,同样合并成570570570,去重复后,得到 570
这样就得到2024组数据,竖排,这2024组数据中若有重复的,去重复,比如:
1245690
1245690
570
570
仅保留一行数据,得到:
1245690
570
上述中间过程在运算中不需显示,只要得到最终结果即可,最终结果覆盖原文本数据,原文本名称不变。
2、再处理第二个文本、第三个文本...
这样的代码如何写?恳望得到帮助。
作者: c755731262 时间: 2015-2-22 17:42
没看懂意思
作者: tmplinshi 时间: 2015-2-22 23:39
本帖最后由 tmplinshi 于 2015-2-22 23:46 编辑
速度不是很快。注意备份原文件!最好先测试。- @echo off
-
- cd /d "D:\数据\" || (pause & exit /b)
-
- for /f "delims=" %%f in ('dir /a:-d /b *.txt') do (
- set txtFile=%%f
- setlocal enabledelayedexpansion
-
- REM 将文本每一行赋值到伪数组
- set /a n=0, max=0
- for /f "usebackq" %%i in ("!txtFile!") do (
- set /a n += 1
- set v.!n!=%%i
- )
- set /a max=n
-
- REM 生成所有组合
- set /a end=max-3+1
- (for /l %%a in (1, 1, !end!) do (
- set /a start=%%a+1, end=max-1
- for /l %%b in (!start!, 1, !end!) do (
- set /a start=%%b+1
- for /l %%c in (!start!, 1, !max!) do (
- for /f "tokens=1-3" %%i in ("v.%%a v.%%b v.%%c") do (
- echo !%%i!!%%j!!%%k!))))) >.temp_file
-
- REM 去重复、输出结果至原文件
- (for /f %%i in (.temp_file) do (
- set "numbers=%%i"
- set "new="
- for %%n in (1,2,3,4,5,6,7,8,9,0) do (
- if "!numbers:%%n=!" neq "!numbers!" (
- set new=!new!%%n
- )
- )
-
- if not defined #!new! (
- set #!new!=#
- echo !new!
- )
- )) >"!txtFile!"
-
- endlocal
- )
-
- del .temp_file
复制代码
作者: 思想之翼 时间: 2015-2-23 20:00
回复 3# tmplinshi
感谢帮助。
经过测试,该代码合并数据后,缺少若干数据。
作者: tmplinshi 时间: 2015-2-23 20:16
回复 tmplinshi
感谢帮助。
经过测试,该代码合并数据后,缺少若干数据。
思想之翼 发表于 2015-2-23 20:00
可否上传示例文本来说明?(原文本和正确结果的文本)
作者: apang 时间: 2015-2-23 20:27
vbs 来一个- Dim fso, file, f, txt
- Set fso = CreateObject("Scripting.FileSystemObject")
- For Each file in fso.GetFolder("D:\数据").Files
- If LCase(Right(file, 4)) = ".txt" Then
- Set f = fso.OpenTextFile(file, 1)
- txt = f.ReadAll
- f.Close
- fso.OpenTextFile(file, 2, true).Write RegEx(txt)
- End If
- Next
-
- Function RegEx(ByVal txt)
- Dim re, e, n, i, j, k, s, m, m1, str
- Set re = New RegExp
- re.Pattern = "\d+"
- re.Global = True
- Set e = re.Execute(txt)
- n = e.Count - 1
- For i = 0 to n - 2
- For j = i + 1 to n - 1
- For k = j + 1 to n
- s = ""
- For m = 1 to 10
- m1 = m Mod 10
- If InStr(e(i) & e(j) & e(k), m1) Then s = s & m1
- Next
- If InStr(vbCrLf & str, vbCrLf & s & vbCrLf) = 0 Then
- str = str & s & vbCrLf
- End If
- Next
- Next
- Next
- RegEx = str
- End Function
复制代码
作者: 思想之翼 时间: 2015-2-23 20:58
回复 6# apang
感谢帮助。
您给的代码,运行速度非常快。
处理后的数据,还需要删除8位以及8位以上的数据,这一要求在1#没有说明,是我疏忽了。恳望您在代码中加入这功能,好吗?
经过再次验证,发现还是存在缺少数据的错误。上传验证附件,恳望继续得到您的帮助。
作者: 思想之翼 时间: 2015-2-23 21:40
回复 5# tmplinshi
上传缺少若干数据的验证数据。
作者: apang 时间: 2015-2-23 23:01
回复 7# 思想之翼
按照附件所给的24个数据,应该不会出现 12468,是不是你弄错了?
第27行改成:- If Len(s) < 8 and InStr(vbCrLf & str, vbCrLf & s & vbCrLf) = 0 Then
复制代码
可以筛选出小于8位的不重复数据
作者: tmplinshi 时间: 2015-2-23 23:02
回复 tmplinshi
上传缺少若干数据的验证数据。
思想之翼 发表于 2015-2-23 21:40
你说缺少 12468,但是根据你的原数据是不可能有这个组合的。
如图所示,只包含 12468 的只有两个。必须要有 3 组,才会出现 12468 的组合结果。
作者: 思想之翼 时间: 2015-2-23 23:28
回复 10# tmplinshi
是我自己弄错了,是excel函数公式写错了。谢谢您的帮助!
作者: 思想之翼 时间: 2015-2-23 23:29
回复 9# apang
是我自己弄错了。谢谢您的帮助!
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |