标题: [文本处理] 【已解决】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
代码未测试...- @echo off&setlocal ENABLEDELAYEDEXPANSION
- for /r %%a in (*_1.txt) do (
- set "Prefix=%%~dpna"
- set "Prefix=!Prefix:~0,-2!"
- set "All=1234567890"
- set "Ori=1 2 3 4 5 6 7 8 9 0"
- 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 (
- set "Merge=%%1%%2%%3%%4%%5%%6"
- set "Complement=!All!"
- set "Temporary=!Ori!"
- for /l %%i in (0,1,17) do (
- for %%k in (!Merge:~%%i,1!) do (
- set "Complement=!Complement:%%k=!"
- set "Temporary=!Temporary:%%k=-%%k!"
- )
- )
- set "Result="
- for %%p in (!Temporary!) do (
- if %%p lss 0 set "Result=!Result!%%p"
- if "%%p"=="-0" set "Result=!Result!%%p"
- )
- set Result=!Result:-=!
- echo,初始合并值【!Merge!】,处理后合并值【!Result!】,反集【!Complement!】
- )
- )
复制代码
作者: caruko 时间: 2015-2-21 16:00
修复个问题,下面为准。- @echo off&setlocal ENABLEDELAYEDEXPANSION
- for /r %%a in (*_1.txt) do (
- set "Prefix=%%~dpna"
- set "Prefix=!Prefix:~0,-2!"
- set "All=1234567890"
- set "Ori=1 2 3 4 5 6 7 8 9 0"
- 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 (
- set "Merge=%%1%%2%%3%%4%%5%%6"
- set "Complement=!All!"
- set "Temporary=!Ori!"
- for /l %%i in (0,1,17) do (
- for %%k in (!Merge:~%%i,1!) do (
- set "Complement=!Complement:%%k=!"
- set "Temporary=!Temporary:%%k=%%k0!"
- )
- )
- set "Result="
- set "F0=1"
- for %%p in (!Temporary!) do (
- if %%p geq 10 set "Result=!Result!%%p"
- if "%%p"=="0" set "F0=0"
- )
- set "Result=!Result:0=!"
- if !F0! geq 1 set "Result=!Result!0"
- echo,初始合并值【!Merge!】,处理后合并值【!Result!】,反集【!Complement!】
- )
- )
复制代码
作者: terse 时间: 2015-2-21 16:19
- @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 (
- for /f %%c in (!s!_3.txt) do (
- for /f %%d in (!s!_4.txt) do (
- for /f %%e in (!s!_5.txt) do (
- for /f %%f in (!s!_6.txt) do (
- set str=%%a%%b%%c%%d%%e%%f
- set n1=&set n2=
- for /l %%l in (0,1,9) 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
复制代码
作者: 思想之翼 时间: 2015-2-21 17:15
回复 5# terse
感谢帮助。
初步测试,运行速度尚可。
只是导出的3位数据,数据0不是排列在最后。
作者: terse 时间: 2015-2-21 18:17
回复 6# 思想之翼
试下将14行- for /l %%l in (0,1,9) do ...(
复制代码
改为- 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、合并数据- @echo off
- setlocal enabledelayedexpansion
- title 合并数据
- cd /d "D:\数据1\"
- set "fdir=D:\数据2\"
- if not exist "%fdir%" md "%fdir%"
- for /l %%i in (1001 1 1210) do (
- set num=%%i
- set num=!num:~1!
- copy "!num!_1.txt" "%fdir%!num!.txt"
- for /l %%j in (2 1 6) do (
- for /f "delims=" %%a in ('type "%fdir%!num!.txt"') do (
- for /f "delims=" %%b in ('type "!num!_%%j.txt"') do (
- >>$ echo,%%a%%b
- )
- )
- move $ "%fdir%!num!.txt"
- )
- )
- pause
复制代码
2、去除每行合并数据中的重复数字并排序- @echo off
- setlocal enabledelayedexpansion
- title 去除每行合并数据中的重复数字并排序
- cd /d "D:\数据2\"
- for /f "delims=" %%a in ('dir /b *.txt') do (
- for /f "delims=" %%b in ('type "%%a"') do (
- >$1 echo,%%b
- >$2 echo 1234567890
- set /p num=<$2
- for /l %%b in (0 1 9) do (
- findstr "%%b" "$1" >nul 2>nul || (>$2 echo !num:%%b=!)
- set /p num=<$2
- )
- >>$3 echo,!num!
- )
- move /y $3 "%%a"
- )
- del $*
- pause
复制代码
3、取反集(未出现的数)并排序- @echo off
- setlocal enabledelayedexpansion
- title 取反集(未出现的数)并排序
- cd /d "D:\数据2\"
- for /f "delims=" %%a in ('dir /b *.txt') do (
- for /f "delims=" %%b in ('type "%%a"') do (
- >$1 echo,%%b
- >$2 echo 1234567890
- set /p num=<$2
- for /l %%b in (0 1 9) do (
- findstr "%%b" "$1" >nul 2>nul && (>$2 echo !num:%%b=!)
- set /p num=<$2
- )
- echo "!num!"
- if /i "!num:~0,1!" == "e" (
- cd.>>$3
- ) else (
- >>$3 echo,!num!
- )
- )
- move /y $3 "%%a"
- )
- del $*
- pause
复制代码
4、去除每个文档里的重复行- @echo off
- title 去除每个文档里的重复行
- cd /d "D:\数据2\"
- for /f "delims=" %%a in ('dir /b *.txt') do (
- for /f "delims=" %%b in ('type "%%a"') do (
- if not defined %%b set %%b=PK & >>$ echo %%b
- )
- for /f "delims=" %%c in ('type $') do set %%c=<nul
- move $ "%%a"
- )
- pause
复制代码
5、提取数字- @echo off
- setlocal enabledelayedexpansion
- title 提取数字
- cd /d "D:\数据2\"
- for /f "delims=" %%a in ('dir /b *.txt') do (
- cd.>$
- for /f "delims=" %%b in ('type "%%a"') do (
- set "str=%%b"
- ::如果第三位数不为空
- if not "!str:~2,1!"=="" (
- ::如果第四位数为空,此处改为!str:~4,1!可提取3~4位的数
- if "!str:~3,1!"=="" (
- ::提取3位的数,调整相应的截取位置即可提取不同位数的数
- >>$ echo !str!
- )
- )
- )
- move $ "%%a"
- )
- pause
复制代码
作者: 思想之翼 时间: 2015-2-21 22:24
回复 5# terse
若要取由3-4个数字组成的数据(比如 368 3690 ),代码如何修改?恳望继续得到您的帮助。
作者: caruko 时间: 2015-2-22 12:36
好吧,之前的只有代码,自己实现输出txt,这个是输出txt- @echo off&setlocal ENABLEDELAYEDEXPANSION
- for /r %%a in (*_1.txt) do (
- set "Prefix=%%~dpna"
- set "Prefix=!Prefix:~0,-2!"
- set "All=1234567890"
- set "Ori=1 2 3 4 5 6 7 8 9 0"
- (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 (
- set "Merge=%%1%%2%%3%%4%%5%%6"
- set "Complement=!All!"
- set "Temporary=!Ori!"
- for /l %%i in (0,1,17) do (
- for %%k in (!Merge:~%%i,1!) do (
- set "Complement=!Complement:%%k=!"
- set "Temporary=!Temporary:%%k=%%k0!"
- )
- )
- set "Result="
- set "F0=1"
- for %%p in (!Temporary!) do (
- if %%p geq 10 set "Result=!Result!%%p"
- if "%%p"=="0" set "F0=0"
- )
- set "Result=!Result:0=!"
- if !F0! geq 1 set "Result=!Result!0"
- if !Result! gtr 100 if !Result! lss 999 if not defined _!Result! set _!Result!=1&echo,!Result!
- ))>!Prefix!.txt
- )
- rem 修改 25 行 gtr lss 值,可筛选输出的值, >100 and <999 只输出3位数, >100 and <9999 可输出 3-4位数。
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |