Board logo

标题: [文本处理] [已解决]批处理:按列分解并合并数值 [打印本页]

作者: 思想之翼    时间: 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

  1. @echo off&setlocal enabledelayedexpansion
  2. md New 2>nul
  3. for /f "tokens=1,2" %%a in (a.txt) do (
  4.   set/a n+=1&set "aa=%%b"
  5.   for /l %%c in (0 1 62) do (
  6.     set "str%%c=!str%%c! !aa:~%%c,1!"
  7.     set/a name=%%c+1
  8.     if "!name:~1!"=="" set name=0!name!
  9.     if !n! geq 3 echo,%%a !str%%c:~-5!>>New\!name!.txt
  10.   )
  11. )
复制代码

作者: terse    时间: 2012-8-20 10:11

效率稍升点
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1,2" %%i in (附件.txt) do (
  3.     set str2=!str1!
  4.     set str1=!str!
  5.     set "str= %%j"
  6.     if not "!str2!" == ""  (
  7.        for /l %%a in (1 1 63) do (
  8.            set N=0%%a.txt
  9.            >>!N:~-6! echo %%i !str2:~%%a,1! !str1:~%%a,1! !str:~%%a,1!
  10.        )
  11.     )
  12. )
  13. pause
复制代码

作者: poter    时间: 2012-8-20 15:04

用vbs会简单一些,bat会很累赘,楼主把old.txt改成你的文件名就可以了
  1. @ECHO OFF
  2. Setlocal enableDelayedExpansion
  3. for /l %%i in (0,1,62) do (
  4. set /a count1=%%i+1&set count1=00!count1!&set count1=!count1:~-2!
  5. set str1=&set count=
  6. for /f "tokens=1,2" %%j in (old.txt) do (
  7. set str=%%k&set str=!str:~%%i,1!
  8. set str1=!str1! !str!&set /a count+=1
  9. if !count! geq 3 echo %%j !str1:~-5!>>!count1!.txt
  10. )
  11. )
复制代码

作者: 思想之翼    时间: 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行:
  1. @echo off&setlocal enabledelayedexpansion
  2. md New 2>nul
  3. for /f "tokens=1,2" %%a in (a.txt) do (
  4.   set /a Lin+=1,m=Lin %% 2
  5.   if !m! equ 1 (
  6.     set "str=%%b"
  7.     set /a n+=1
  8.     for /l %%c in (0 1 62) do (
  9.       set "str%%c=!str%%c! !str:~%%c,1!"
  10.       set /a Name=%%c+1
  11.       if "!Name:~1!"=="" set "Name=0!Name!"
  12.       if !n! geq 3 echo,%%a !str%%c:~-5!>>New\!Name!.txt
  13.     )
  14.   )
  15. )
  16. 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
  1. @echo off&setlocal enabledelayedexpansion
  2. md New_files 2>nul
  3. set Lin=2
  4. set /a "Lins=(Lin+1)*2,Lin+=1"
  5. for /f "tokens=1*" %%i in (附件.txt) do (
  6.     set /a n+=1
  7.     set "Lin!n!= %%j"
  8.     if !n! GTR !Lins! (
  9.        set /a m=n-Lins
  10.        for /l %%a in (!M! !lin! !n!) do (
  11.            set str2=!str1!
  12.            set str1=!str!
  13.            set "str=!Lin%%a!"
  14.        )
  15.        for /l %%b in (1 1 63) do (
  16.            set Name=0%%b
  17.            >>"New_files\!Name:~-2!.txt" echo %%i !str2:~%%b,1! !str1:~%%b,1! !str:~%%b,1!
  18.        )
  19.     )
  20. )
  21. 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

  1. @echo off&setlocal enabledelayedexpansion
  2. md New 2>nul
  3. set step=1
  4. for /f "tokens=1,2" %%a in (a.txt) do (
  5.   set /a n+=1,m=n-step,k=m-step
  6.   set "_!n!=%%b"
  7.   if defined _!k! (
  8.     for /l %%c in (0 1 62) do (
  9.       set /a Name=%%c + 101
  10.       for %%d in (!k! !m! !n!) do (
  11.         set aa=!_%%d!
  12.         set "str=!str! !aa:~%%c,1!"
  13.       )
  14.       echo,%%a !str:~1!>>"New\!Name:~1!.txt"
  15.       set "str="
  16.     )
  17.   )
  18. )
  19. 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文档放在一起
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (1 1 63) do (
  3.   set /a Name=%%a+100,n=0
  4.   for /f "usebackq tokens=1*" %%b in ("!Name:~1!.txt") do (
  5.     set /a n+=1
  6.     for %%i in (!n!) do (
  7.       if %%a==1 (set "_%%i=%%b %%c") else set "_%%i=!_%%i! %%c"
  8.     )
  9.   )
  10. )
  11. (for /l %%a in (1 1 !n!) do echo,!_%%a!)>Result.txt
  12. pause
复制代码

作者: 思想之翼    时间: 2013-2-23 14:16

本帖最后由 思想之翼 于 2013-2-23 14:28 编辑

回复 20# apang


    谢谢!您的代码给我很大启发。将63个文本合并的代码,是在已经产生63个文本后的情况下使用的,能否在用18楼的代码处理数据时,不分成63个文本,直接产生紧凑型的数据(即4321,非4 3 2 1),并存放在1个文本中?




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