Board logo

标题: [文本处理] 【已解决】BAT或VBS:如何将多个文本内的数据进行交叉合并 [打印本页]

作者: 思想之翼    时间: 2015-2-20 23:04     标题: 【已解决】BAT或VBS:如何将多个文本内的数据进行交叉合并

本帖最后由 思想之翼 于 2015-2-25 01:50 编辑

D:/数据1/内有若干txt文本:
001_1.txt
001_2.txt
001_3.txt
001_4.txt
001_5.txt
001_6.txt

002_1.txt
002_2.txt
002_3.txt
002_4.txt
002_5.txt
002_6.txt
...
210_1.txt
210_2.txt
210_3.txt
210_4.txt
210_5.txt
210_6.txt

每个txt文本内有8行数据,每行数据为0-9之间的3个数,且数据从小到大排列(数据0永远排列在最后一位),其格式如下:
790
159
140
249
457
127
368
250

现在欲将001_1.txt至001_6.txt内的数据交叉合并,步骤如下:
1、先将001_1.txt与001_2.txt内的数据交叉合并,即:
001_1.txt内第1行数据与001_2.txt内的第1、2、3、4、5、6、7、8行数据合并
001_1.txt内第2行数据与001_2.txt内的第1、2、3、4、5、6、7、8行数据合并
...
001_1.txt内第8行数据与001_2.txt内的第1、2、3、4、5、6、7、8行数据合并
共得到64行数据,每行数据为0-9之间的6个数(数字有重复)

2、将这64行数据,与001_3.txt内的数据交叉合并
共得到512行数据,每行数据为0-9之间的9个数(数字有重复)

3、将这512行数据,与001_4.txt内的数据交叉合并
共得到4096行数据,每行数据为0-9之间的12个数(数字有重复)

4、将这4096行数据,与001_5.txt内的数据交叉合并
共得到32768行数据,每行数据为0-9之间的15个数(数字有重复)

5、将这32768行数据,与001_6.txt内的数据交叉合并
共得到262144行数据,每行数据为0-9之间的18个数(数字有重复)

6、合并后每行数据有重复数字,重复数只保留1个,删除重复数处理后,保留的数字从小到大排列(数据0永远排列在最后一位)。比如合并后第1行数据:790159140249457127,去除重复数,保留:1245790

7、去除重复数后的每行数据,分别取反集(0-9数值之间的未出现数),且数据从小到大排列(数据0永远排列在最后一位)。即:
1245790的反集(0-9数值之间未出现数)是:368
124578的反集(0-9数值之间未出现数)是:3690
...
得到数据
368
3690
...

8、去除重复数后的多行数据,若有相同数据的行,只保留1行。比如:
368
368
3690
3690
...
去除相同数据行,得到数据:
368
3690
...

9、在上述数据中,提取由3个数字组成的多行数据(比如 368),竖排,写入D:/数据2/内的文本,文本名称为001.txt
如果没有3个数字组成的数据,则写入D:/数据2/内的文本为空。
【若要取由3-4个数字组成的数据(比如 368 3690 ),竖排,写入D:/数据2/内的文本,文本名称为001.txt,代码如何修改?】


以上是将001_1.txt至001_6.txt内的数据交叉合并。之后,
将002_1.txt至002_6.txt内的数据交叉合并,得到的数据,竖排,写入D:/数据2/内,文本名称为002.txt
将003_1.txt至003_6.txt内的数据交叉合并,得到的数据,竖排,写入D:/数据2/内,文本名称为003.txt
...
将210_1.txt至210_6.txt内的数据交叉合并,得到的数据,竖排,写入D:/数据2/内,文本名称为210.txt


这样的代码如何写?恳望得到帮助。
作者: caruko    时间: 2015-2-21 12:06

批处理能是能做到,但是建议用 高级语言来做...

大概一天一夜也处理不完。

另外,中间数据如果不是必须的,可以直接生成最终数据,可以提升节省大量时间,
作者: caruko    时间: 2015-2-21 15:49

代码未测试...
  1. @echo off&setlocal ENABLEDELAYEDEXPANSION
  2. for /r %%a in (*_1.txt) do (
  3. set "Prefix=%%~dpna"
  4. set "Prefix=!Prefix:~0,-2!"
  5. set "All=1234567890"
  6. set "Ori=1 2 3 4 5 6 7 8 9 0"
  7. for /f usebackq %%1 in ("!Prefix!_1.txt") do for /f usebackq %%2 in ("!Prefix!_2.txt") do for /f usebackq %%3 in ("!Prefix!_3.txt") do for /f usebackq %%4 in ("!Prefix!_4.txt") do for /f usebackq %%5 in ("!Prefix!_5.txt") do for /f usebackq %%6 in ("!Prefix!_6.txt") do (
  8. set "Merge=%%1%%2%%3%%4%%5%%6"
  9. set "Complement=!All!"
  10. set "Temporary=!Ori!"
  11. for /l %%i in (0,1,17) do (
  12. for %%k in (!Merge:~%%i,1!) do (
  13. set "Complement=!Complement:%%k=!"
  14. set "Temporary=!Temporary:%%k=-%%k!"
  15. )
  16. )
  17. set "Result="
  18. for %%p in (!Temporary!) do (
  19. if %%p lss 0 set "Result=!Result!%%p"
  20. if "%%p"=="-0" set "Result=!Result!%%p"
  21. )
  22. set Result=!Result:-=!
  23. echo,初始合并值【!Merge!】,处理后合并值【!Result!】,反集【!Complement!】
  24. )
  25. )
复制代码

作者: caruko    时间: 2015-2-21 16:00

修复个问题,下面为准。
  1. @echo off&setlocal ENABLEDELAYEDEXPANSION
  2. for /r %%a in (*_1.txt) do (
  3. set "Prefix=%%~dpna"
  4. set "Prefix=!Prefix:~0,-2!"
  5. set "All=1234567890"
  6. set "Ori=1 2 3 4 5 6 7 8 9 0"
  7. for /f usebackq %%1 in ("!Prefix!_1.txt") do for /f usebackq %%2 in ("!Prefix!_2.txt") do for /f usebackq %%3 in ("!Prefix!_3.txt") do for /f usebackq %%4 in ("!Prefix!_4.txt") do for /f usebackq %%5 in ("!Prefix!_5.txt") do for /f usebackq %%6 in ("!Prefix!_6.txt") do (
  8. set "Merge=%%1%%2%%3%%4%%5%%6"
  9. set "Complement=!All!"
  10. set "Temporary=!Ori!"
  11. for /l %%i in (0,1,17) do (
  12. for %%k in (!Merge:~%%i,1!) do (
  13. set "Complement=!Complement:%%k=!"
  14. set "Temporary=!Temporary:%%k=%%k0!"
  15. )
  16. )
  17. set "Result="
  18. set "F0=1"
  19. for %%p in (!Temporary!) do (
  20. if %%p geq 10 set "Result=!Result!%%p"
  21. if "%%p"=="0" set "F0=0"
  22. )
  23. set "Result=!Result:0=!"
  24. if !F0! geq 1 set "Result=!Result!0"
  25. echo,初始合并值【!Merge!】,处理后合并值【!Result!】,反集【!Complement!】
  26. )
  27. )
复制代码

作者: terse    时间: 2015-2-21 16:19

  1. @echo off
  2. for /l %%i in (1001 1 1210) do (
  3.     set s=%%i
  4.     setlocal enabledelayedexpansion
  5.     set s=!s:~1!
  6.     (for /f %%a in (!s!_1.txt) do (
  7.         for /f %%b in (!s!_2.txt) do (
  8.             for /f %%c in (!s!_3.txt) do (
  9.                 for /f %%d in (!s!_4.txt) do (
  10.                     for /f %%e in (!s!_5.txt) do (                        
  11.                         for /f %%f in (!s!_6.txt) do (
  12.                             set str=%%a%%b%%c%%d%%e%%f
  13.                             set n1=&set n2=
  14.                             for /l %%l in (0,1,9) do (
  15.                                 if "!str:%%l=!" neq "!str!" (
  16.                                    set n1=!n1!%%l
  17.                                 ) else  set n2=!n2!%%l
  18.                             )
  19.                             set n=!n1!A9876543210
  20.                             if "!n:~10,1!" == "3" (
  21.                                if not defined _!n1! (
  22.                                   set _!n1!=0&echo,!n1!
  23.                                )
  24.                             ) else if "!n:~10,1!" == "7" (
  25.                                 if not defined _!n2! (
  26.                                    set _!n2!=0&echo,!n2!
  27.                                 )
  28.                             )
  29.                         )
  30.                     )
  31.                 )
  32.             )
  33.         )
  34.     ))>d:\数据2\!s!.txt
  35.     endlocal
  36. )
  37. pause
复制代码

作者: 思想之翼    时间: 2015-2-21 17:15

回复 5# terse

感谢帮助。
初步测试,运行速度尚可。
只是导出的3位数据,数据0不是排列在最后。
作者: terse    时间: 2015-2-21 18:17

回复 6# 思想之翼
试下将14行
  1.   for /l %%l in (0,1,9) do ...(
复制代码
改为
  1. for %%l in (1 2 3 4 5 6 7 8 9 0) do (
复制代码

作者: pcl_test    时间: 2015-2-21 20:40

本帖最后由 pcl_test 于 2015-2-21 21:05 编辑

回复 1# 思想之翼

1、合并数据
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. title 合并数据
  4. cd /d "D:\数据1\"
  5. set "fdir=D:\数据2\"
  6. if not exist "%fdir%" md "%fdir%"
  7. for /l %%i in (1001 1 1210) do (
  8. set num=%%i
  9. set num=!num:~1!
  10. copy "!num!_1.txt" "%fdir%!num!.txt"
  11. for /l %%j in (2 1 6) do (
  12. for /f "delims=" %%a in ('type "%fdir%!num!.txt"') do (
  13. for /f "delims=" %%b in ('type "!num!_%%j.txt"') do (
  14. >>$ echo,%%a%%b
  15. )
  16. )
  17. move $ "%fdir%!num!.txt"
  18. )
  19. )
  20. pause
复制代码
2、去除每行合并数据中的重复数字并排序
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. title 去除每行合并数据中的重复数字并排序
  4. cd /d "D:\数据2\"
  5. for /f "delims=" %%a in ('dir /b *.txt') do (
  6. for /f "delims=" %%b in ('type "%%a"') do (
  7. >$1 echo,%%b
  8. >$2 echo 1234567890
  9. set /p num=<$2
  10. for /l %%b in (0 1 9) do (
  11. findstr "%%b" "$1" >nul 2>nul || (>$2 echo !num:%%b=!)
  12. set /p num=<$2
  13. )
  14. >>$3 echo,!num!
  15. )
  16. move /y $3 "%%a"
  17. )
  18. del $*
  19. pause
复制代码
3、取反集(未出现的数)并排序
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. title 取反集(未出现的数)并排序
  4. cd /d "D:\数据2\"
  5. for /f "delims=" %%a in ('dir /b *.txt') do (
  6. for /f "delims=" %%b in ('type "%%a"') do (
  7. >$1 echo,%%b
  8. >$2 echo 1234567890
  9. set /p num=<$2
  10. for /l %%b in (0 1 9) do (
  11. findstr "%%b" "$1" >nul 2>nul && (>$2 echo !num:%%b=!)
  12. set /p num=<$2
  13. )
  14. echo "!num!"
  15. if /i "!num:~0,1!" == "e" (
  16. cd.>>$3
  17. ) else (
  18. >>$3 echo,!num!
  19. )
  20. )
  21. move /y $3 "%%a"
  22. )
  23. del $*
  24. pause
复制代码
4、去除每个文档里的重复行
  1. @echo off
  2. title 去除每个文档里的重复行
  3. cd /d "D:\数据2\"
  4. for /f "delims=" %%a in ('dir /b *.txt') do (
  5. for /f "delims=" %%b in ('type "%%a"') do (
  6. if not defined %%b set %%b=PK & >>$ echo %%b
  7. )
  8. for /f "delims=" %%c in ('type $') do set %%c=<nul
  9. move $ "%%a"
  10. )
  11. pause
复制代码
5、提取数字
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. title 提取数字
  4. cd /d "D:\数据2\"
  5. for /f "delims=" %%a in ('dir /b *.txt') do (
  6. cd.>$
  7. for /f "delims=" %%b in ('type "%%a"') do (
  8. set "str=%%b"
  9. ::如果第三位数不为空
  10. if not "!str:~2,1!"=="" (
  11. ::如果第四位数为空,此处改为!str:~4,1!可提取3~4位的数
  12. if "!str:~3,1!"=="" (
  13. ::提取3位的数,调整相应的截取位置即可提取不同位数的数
  14. >>$ echo !str!
  15. )
  16. )
  17. )
  18. move $ "%%a"
  19. )
  20. pause
复制代码

作者: 思想之翼    时间: 2015-2-21 22:24

回复 5# terse

若要取由3-4个数字组成的数据(比如 368 3690 ),代码如何修改?恳望继续得到您的帮助。
作者: caruko    时间: 2015-2-22 12:36

好吧,之前的只有代码,自己实现输出txt,这个是输出txt
  1. @echo off&setlocal ENABLEDELAYEDEXPANSION
  2. for /r %%a in (*_1.txt) do (
  3. set "Prefix=%%~dpna"
  4. set "Prefix=!Prefix:~0,-2!"
  5. set "All=1234567890"
  6. set "Ori=1 2 3 4 5 6 7 8 9 0"
  7. (for /f usebackq %%1 in ("!Prefix!_1.txt") do for /f usebackq %%2 in ("!Prefix!_2.txt") do for /f usebackq %%3 in ("!Prefix!_3.txt") do for /f usebackq %%4 in ("!Prefix!_4.txt") do for /f usebackq %%5 in ("!Prefix!_5.txt") do for /f usebackq %%6 in ("!Prefix!_6.txt") do (
  8. set "Merge=%%1%%2%%3%%4%%5%%6"
  9. set "Complement=!All!"
  10. set "Temporary=!Ori!"
  11. for /l %%i in (0,1,17) do (
  12. for %%k in (!Merge:~%%i,1!) do (
  13. set "Complement=!Complement:%%k=!"
  14. set "Temporary=!Temporary:%%k=%%k0!"
  15. )
  16. )
  17. set "Result="
  18. set "F0=1"
  19. for %%p in (!Temporary!) do (
  20. if %%p geq 10 set "Result=!Result!%%p"
  21. if "%%p"=="0" set "F0=0"
  22. )
  23. set "Result=!Result:0=!"
  24. if !F0! geq 1 set "Result=!Result!0"
  25. if !Result! gtr 100 if !Result! lss 999 if not defined _!Result! set _!Result!=1&echo,!Result!
  26. ))>!Prefix!.txt
  27. )
  28. rem 修改 25 行 gtr  lss 值,可筛选输出的值, >100 and <999 只输出3位数, >100 and <9999 可输出 3-4位数。
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2