[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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

你貌似发过这个主题。请搜索。

TOP

本帖最后由 思想之翼 于 2012-8-18 18:44 编辑

谢谢关注!标题确有几个相似的字眼,但实质要求大相径庭。

TOP

本帖最后由 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 是如何获取的

TOP

回复  思想之翼



之中的 2012003 是如何获取的
canyuexiaolang 发表于 2012-8-18 18:47



    2012003中的数值,是2012001、2012002与2012003第一列的数值合并。

TOP

解释:第1列分解为
2012001 8
2012002 8
2012003 4
数值8、8、4合并,即为2012003 8 8 4。以此类推。)

TOP

2012003中的数值,是2012001、2012002与2012003第一列的数值合并。
思想之翼 发表于 2012-8-18 19:06



就是说三行数据中, 只取最后一行的日期, 然后再加上那个第一列的数据, 是这样么?

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

效率稍升点
  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

用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

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

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

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

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

本帖最后由 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

返回列表