标题: [文本处理] [已解决]批处理:按列分解并合并数值 [打印本页]
作者: 思想之翼 时间: 2012-8-18 18:26 标题: [已解决]批处理:按列分解并合并数值
txt文本格式如下:
2012001 881326479827982215376661104075627562215134770215904750475000205
2012002 852936741581825592693814730741583621314473062804000008756402580
2012003 423972451943972083497201350215721350461235862866864882866172386
2012004 011123111232234234345011123111230012012121000000000001123123236
2012005 256164905083831942972432324761681611502572248880866602720440400
......
每行前7个数值是时间码,后记录有63个数值,记为63列。现欲按列分为01-63个txt文本,并依次合并该列的前3行数值,结果如下:
01 txt:
2012003 8 8 4
2012004 8 4 0
2012005 4 0 2
......
(解释:第1列分解为
2012001 8
2012002 8
2012003 4
数值8、8、4合并,即为2012003 8 8 4。以此类推。)
63 txt:
2012003 5 0 6
2012004 0 6 6
2012005 6 6 0
......
恳望出手相助!
作者: canyuexiaolang 时间: 2012-8-18 18:33
你貌似发过这个主题。请搜索。
作者: 思想之翼 时间: 2012-8-18 18:40
本帖最后由 思想之翼 于 2012-8-18 18:44 编辑
谢谢关注!标题确有几个相似的字眼,但实质要求大相径庭。
作者: canyuexiaolang 时间: 2012-8-18 18:47
本帖最后由 canyuexiaolang 于 2012-8-18 18:48 编辑
回复 3# 思想之翼
01 txt:
2012003 8 8 4(第1列2012001 8;2012002 8;2012003 4)
2012004 8 4 0
2012005 4 0 2
之中的 2012003 是如何获取的
作者: 思想之翼 时间: 2012-8-18 19:06
回复 思想之翼
之中的 2012003 是如何获取的
canyuexiaolang 发表于 2012-8-18 18:47
2012003中的数值,是2012001、2012002与2012003第一列的数值合并。
作者: 思想之翼 时间: 2012-8-18 19:27
解释:第1列分解为
2012001 8
2012002 8
2012003 4
数值8、8、4合并,即为2012003 8 8 4。以此类推。)
作者: 极品小猫 时间: 2012-8-19 02:03
2012003中的数值,是2012001、2012002与2012003第一列的数值合并。
思想之翼 发表于 2012-8-18 19:06
就是说三行数据中, 只取最后一行的日期, 然后再加上那个第一列的数据, 是这样么?
作者: apang 时间: 2012-8-19 12:01
- @echo off&setlocal enabledelayedexpansion
- md New 2>nul
- for /f "tokens=1,2" %%a in (a.txt) do (
- set/a n+=1&set "aa=%%b"
- for /l %%c in (0 1 62) do (
- set "str%%c=!str%%c! !aa:~%%c,1!"
- set/a name=%%c+1
- if "!name:~1!"=="" set name=0!name!
- if !n! geq 3 echo,%%a !str%%c:~-5!>>New\!name!.txt
- )
- )
复制代码
作者: terse 时间: 2012-8-20 10:11
效率稍升点- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1,2" %%i in (附件.txt) do (
- set str2=!str1!
- set str1=!str!
- set "str= %%j"
- if not "!str2!" == "" (
- for /l %%a in (1 1 63) do (
- set N=0%%a.txt
- >>!N:~-6! echo %%i !str2:~%%a,1! !str1:~%%a,1! !str:~%%a,1!
- )
- )
- )
- pause
复制代码
作者: poter 时间: 2012-8-20 15:04
用vbs会简单一些,bat会很累赘,楼主把old.txt改成你的文件名就可以了- @ECHO OFF
- Setlocal enableDelayedExpansion
- for /l %%i in (0,1,62) do (
- set /a count1=%%i+1&set count1=00!count1!&set count1=!count1:~-2!
- set str1=&set count=
- for /f "tokens=1,2" %%j in (old.txt) do (
- set str=%%k&set str=!str:~%%i,1!
- set str1=!str1! !str!&set /a count+=1
- if !count! geq 3 echo %%j !str1:~-5!>>!count1!.txt
- )
- )
复制代码
作者: 思想之翼 时间: 2013-1-20 03:44
回复 8# apang
您写的批处理代码帮了大忙,谢谢热心帮助!
现在运用中,有新的需求,恳望再次得到您的帮助:如何隔行合并数值?
例如:
txt文本格式如下:
2012001 881326479827982215376661104075627562215134770215904750475000205
2012002 852936741581825592693814730741583621314473062804000008756402580
2012003 423972451943972083497201350215721350461235862866864882866172386
2012004 011123111232234234345011123111230012012121000000000001123123236
2012005 256164905083831942972432324761681611502572248880866602720440400
......
1、上述例子中,第1列分解为
2012001 8
2012002 8
2012003 4
2012004 0
2012005 2
......
将第1列的隔行数值8、4、2合并,即为2012005 8 4 2。第2列...第63列以此类推。
2、此为隔1行,如果隔2-20行合并,批处理代码修改哪里?
作者: 思想之翼 时间: 2013-1-20 03:52
回复 9# terse
您写的批处理代码帮了大忙,谢谢热心帮助!
现在运用中,有新的需求,恳望再次得到您的帮助:如何隔行合并数值?
例如:
txt文本格式如下:
2012001 881326479827982215376661104075627562215134770215904750475000205
2012002 852936741581825592693814730741583621314473062804000008756402580
2012003 423972451943972083497201350215721350461235862866864882866172386
2012004 011123111232234234345011123111230012012121000000000001123123236
2012005 256164905083831942972432324761681611502572248880866602720440400
......
1、上述例子中,第1列分解为
2012001 8
2012002 8
2012003 4
2012004 0
2012005 2
......
将第1列的隔行数值8、4、2合并,即为2012005 8 4 2。第2列...第63列以此类推。
2、此为隔1行,如果隔2-20行合并,批处理代码修改哪里?
作者: apang 时间: 2013-1-20 12:20
回复 11# 思想之翼
隔2行:- @echo off&setlocal enabledelayedexpansion
- md New 2>nul
- for /f "tokens=1,2" %%a in (a.txt) do (
- set /a Lin+=1,m=Lin %% 2
- if !m! equ 1 (
- set "str=%%b"
- set /a n+=1
- for /l %%c in (0 1 62) do (
- set "str%%c=!str%%c! !str:~%%c,1!"
- set /a Name=%%c+1
- if "!Name:~1!"=="" set "Name=0!Name!"
- if !n! geq 3 echo,%%a !str%%c:~-5!>>New\!Name!.txt
- )
- )
- )
- pause
复制代码
如果隔3行,将代码第4行的数字2改为3
作者: 思想之翼 时间: 2013-1-23 02:23
回复 13# apang
谢谢您的热心帮助!可能是我叙述不明,您写的批处理代码,与现实需求有点出入。比如:下列数据的第一列,隔2行数据合并,得到的结果是:
0000005 2 1 1
0000007 1 1 2
0000009 1 2 9
缺少
0000006 5 5 2
0000008 5 2 2
恳望再次得到您的帮助!
举例数据:
0000001 200042888206608608082244402222200042042422511195555559915915155
0000002 569249703501461794279125205143143423750275684044210618088049004
0000003 144030339296252252181122818339290616616707033929000009767767818
0000004 580130134636796918291368118354252752970297479029860863043081008
0000005 123584902511362473958321160124331342251716852679042480055862867
0000006 217956391788067623451217956157346845221431000000248027956352540
0000007 227759611931193648486441131055735573022224222240444804480935355
0000008 226002048804880224688222442042204220664022553115555555555775955
0000009 942051319406495273516142051531422493271516055500680043504502000
作者: terse 时间: 2013-1-23 10:25
本帖最后由 terse 于 2013-1-23 12:16 编辑
这样的?
一个计算的错误 修改
如果隔N行合并,修改代码第三行 set Lin=N- @echo off&setlocal enabledelayedexpansion
- md New_files 2>nul
- set Lin=2
- set /a "Lins=(Lin+1)*2,Lin+=1"
- for /f "tokens=1*" %%i in (附件.txt) do (
- set /a n+=1
- set "Lin!n!= %%j"
- if !n! GTR !Lins! (
- set /a m=n-Lins
- for /l %%a in (!M! !lin! !n!) do (
- set str2=!str1!
- set str1=!str!
- set "str=!Lin%%a!"
- )
- for /l %%b in (1 1 63) do (
- set Name=0%%b
- >>"New_files\!Name:~-2!.txt" echo %%i !str2:~%%b,1! !str1:~%%b,1! !str:~%%b,1!
- )
- )
- )
- pause
复制代码
作者: 思想之翼 时间: 2013-1-23 10:42
本帖最后由 思想之翼 于 2013-1-23 10:51 编辑
回复 15# terse
谢谢关注!试验一下,发现数据合并结果不对,整体错位了1行。
结果为
0000006 2 1 1
0000007 5 5 2
0000008 1 1 2
0000009 5 2 2
应为
0000005 2 1 1
0000006 5 5 2
0000007 1 1 2
0000008 5 2 2
另,合并后的结果能否新建一个文件夹?
作者: terse 时间: 2013-1-23 11:28
回复 16# 思想之翼
已修改 再试
作者: apang 时间: 2013-1-23 12:48
- @echo off&setlocal enabledelayedexpansion
- md New 2>nul
- set step=1
- for /f "tokens=1,2" %%a in (a.txt) do (
- set /a n+=1,m=n-step,k=m-step
- set "_!n!=%%b"
- if defined _!k! (
- for /l %%c in (0 1 62) do (
- set /a Name=%%c + 101
- for %%d in (!k! !m! !n!) do (
- set aa=!_%%d!
- set "str=!str! !aa:~%%c,1!"
- )
- echo,%%a !str:~1!>>"New\!Name:~1!.txt"
- set "str="
- )
- )
- )
- pause
复制代码
更改第3行的数字即可,试试?
作者: 思想之翼 时间: 2013-2-22 11:24
本帖最后由 思想之翼 于 2013-2-22 21:10 编辑
回复 18# apang
谢谢!VBA代码完美解决问题。研究您的代码,想扩展运用,但是遇到了问题:
1、此代码得到的单个txt文本的数据格式是0000001 4 3 9 2,若数据格式改为0000001 4392,如何修改代码?
2、此代码处理后有01-63个txt文本,若只产生1个txt文本,合并分散在01-63个txt文本的数据,数据格式为0000001 4392 2135 3695 2587 ......9987,第一列0000001是时间序号,第二列4392是01.txt的数值,第三列2135是02.txt的数值......第64列9987是63.txt的数值,这又该如何修改代码?
恳望得到您的帮助!
作者: apang 时间: 2013-2-23 12:53
0000001 4 3 9 2 为什么是5列而不是4列?假设是4列:
1.18楼第12行:set "str=!str!!aa:~%%c,1!"
第14行:echo,%%a !str!>>"New\!Name:~1!.txt"
2.与63个txt文档放在一起- @echo off&setlocal enabledelayedexpansion
- for /l %%a in (1 1 63) do (
- set /a Name=%%a+100,n=0
- for /f "usebackq tokens=1*" %%b in ("!Name:~1!.txt") do (
- set /a n+=1
- for %%i in (!n!) do (
- if %%a==1 (set "_%%i=%%b %%c") else set "_%%i=!_%%i! %%c"
- )
- )
- )
- (for /l %%a in (1 1 !n!) do echo,!_%%a!)>Result.txt
- pause
复制代码
作者: 思想之翼 时间: 2013-2-23 14:16
本帖最后由 思想之翼 于 2013-2-23 14:28 编辑
回复 20# apang
谢谢!您的代码给我很大启发。将63个文本合并的代码,是在已经产生63个文本后的情况下使用的,能否在用18楼的代码处理数据时,不分成63个文本,直接产生紧凑型的数据(即4321,非4 3 2 1),并存放在1个文本中?
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |