[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]批处理:按列分解并合并数值

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
......
恳望出手相助!
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

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

回复 20# apang


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

TOP

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
复制代码

TOP

本帖最后由 思想之翼 于 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的数值,这又该如何修改代码?
恳望得到您的帮助!

TOP

  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行的数字即可,试试?
1

评分人数

TOP

回复 16# 思想之翼
已修改 再试

TOP

本帖最后由 思想之翼 于 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
另,合并后的结果能否新建一个文件夹?

TOP

本帖最后由 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
复制代码
1

评分人数

TOP

回复 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

TOP

回复 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
1

评分人数

TOP

回复 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行合并,批处理代码修改哪里?

TOP

回复 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行合并,批处理代码修改哪里?

TOP

用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. )
复制代码

TOP

效率稍升点
  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
复制代码
1

评分人数

TOP

  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. )
复制代码
1

评分人数

TOP

返回列表