Board logo

标题: [文本处理] 【已解决】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 编辑

速度不是很快。注意备份原文件!最好先测试。
  1. @echo off
  2. cd /d "D:\数据\" || (pause & exit /b)
  3. for /f "delims=" %%f in ('dir /a:-d /b *.txt') do (
  4.     set txtFile=%%f
  5.     setlocal enabledelayedexpansion
  6.    
  7.     REM 将文本每一行赋值到伪数组
  8.     set /a n=0, max=0
  9.     for /f "usebackq" %%i in ("!txtFile!") do (
  10.         set /a n += 1
  11.         set v.!n!=%%i
  12.     )
  13.     set /a max=n
  14.    
  15.     REM 生成所有组合
  16.     set /a end=max-3+1
  17.     (for /l %%a in (1, 1, !end!) do (
  18.         set /a start=%%a+1, end=max-1
  19.         for /l %%b in (!start!, 1, !end!) do (
  20.             set /a start=%%b+1
  21.             for /l %%c in (!start!, 1, !max!) do (
  22.                 for /f "tokens=1-3" %%i in ("v.%%a v.%%b v.%%c") do (
  23.                     echo !%%i!!%%j!!%%k!))))) >.temp_file
  24.    
  25.     REM 去重复、输出结果至原文件
  26.     (for /f %%i in (.temp_file) do (
  27.         set "numbers=%%i"
  28.         set "new="
  29.         for %%n in (1,2,3,4,5,6,7,8,9,0) do (
  30.             if "!numbers:%%n=!" neq "!numbers!" (
  31.                 set new=!new!%%n
  32.             )
  33.         )
  34.         
  35.         if not defined #!new! (
  36.             set #!new!=#
  37.             echo !new!
  38.         )
  39.     )) >"!txtFile!"
  40.    
  41.     endlocal
  42. )
  43. 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 来一个
  1. Dim fso, file, f, txt
  2. Set fso = CreateObject("Scripting.FileSystemObject")
  3. For Each file in fso.GetFolder("D:\数据").Files
  4.     If LCase(Right(file, 4)) = ".txt" Then
  5.         Set f = fso.OpenTextFile(file, 1)
  6.         txt = f.ReadAll
  7.         f.Close
  8.         fso.OpenTextFile(file, 2, true).Write RegEx(txt)
  9.     End If
  10. Next
  11. Function RegEx(ByVal txt)
  12.     Dim re, e, n, i, j, k, s, m, m1, str
  13.     Set re = New RegExp
  14.     re.Pattern = "\d+"
  15.     re.Global = True
  16.     Set e = re.Execute(txt)
  17.     n = e.Count - 1
  18.     For i = 0 to n - 2
  19.         For j = i + 1 to n - 1
  20.             For k = j + 1 to n
  21.                 s = ""
  22.                 For m = 1 to 10
  23.                     m1 = m Mod 10
  24.                     If InStr(e(i) & e(j) & e(k), m1) Then s = s & m1
  25.                 Next
  26.                 If InStr(vbCrLf & str, vbCrLf & s & vbCrLf) = 0 Then
  27.                     str = str & s & vbCrLf
  28.                 End If
  29.             Next
  30.         Next
  31.     Next
  32.     RegEx = str
  33. 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行改成:
  1. 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