Board logo

标题: [文本处理] [已解决]批处理怎样合并两个文件? [打印本页]

作者: Linux9253    时间: 2015-7-23 13:54     标题: [已解决]批处理怎样合并两个文件?

文件一:SysInfo_SJ_ZF.info
  1. 数据转发
  2. ----------    --------------     --------------     ----  --------  ---------
  3. mksrgtg     2015-07-23      13:29:19.270    0       12      11.97      
  4. mksdt03     2015-07-23      13:29:23.370    -1      72      70.64      
  5. 5fhw2003    2015-07-23      13:29:17.000    3       11      9.93      
  6. dfrq        2015-07-23      13:29:19.000    2       18      18.96      
  7. ----------    --------------     --------------     ----  --------  ---------  
  8. NewTime 13:29:16
复制代码
文件二:SysInfo_SJ_FB.info
  1. 数据发布
  2. ----------    --------------     --------------     ----  --------  ---------  
  3. mksrgtg     2015-07-23      13:34:13.270    2       13      11.90      
  4. mksdt03     2015-07-23      13:43:24.370    -1      77      70.66      
  5. 5fhw2003    2015-07-23      13:53:16.000    2       16      9.23     
  6. dfrq        2015-07-23      13:22:12.000    6       12      18.56      
  7. ----------    --------------     --------------     ----  --------  ---------  
  8. NewTime 13:29:16
复制代码
现在我向把两个文件合并在一起格式是
  1. 数据转发                                                                                          |  数据发布  
  2. ----------    --------------     --------------     ----  --------  ---------   |  ----------    --------------     --------------     ----  --------  ---------  
  3. mksrgtg     2015-07-23      13:29:19.270    0       12      11.97      |   mksrgtg     2015-07-23      13:34:13.270    2       13      11.90
  4. mksdt03    2015-07-23      13:29:23.370    -1      72      70.64      |   mksdt03    2015-07-23      13:43:24.370    -1      77      70.66
  5. 5fhw2003  2015-07-23      13:29:17.000    3       11      9.93        |   5fhw2003   2015-07-23      13:53:16.000    2       16      9.23
  6. dfrq          2015-07-23      13:29:19.000    2       18      18.96       |   dfrq           2015-07-23      13:22:12.000    6       12      18.56
  7. ----------    --------------     --------------     ----  --------  ---------   |   ----------    --------------     --------------     ----  --------  ---------
  8. NewTime 13:29:16                                                                      |  NewTime 13:29:16
复制代码
可能上面的看的不是很清楚、我写个范例吧、
文件一:
1 2 3 4 5
a b c d e
文件二:
6 7 8 9 0
g h i j k

结果:
  1. 1 2 3 4 5 | 6 7 8 9 0
  2. a b c d e  | g h i j k
复制代码
也就是把文件2放在文件1的后面、并且以“|”号分割开来、自我感觉难度不是一般的高、求大神帮忙。。。。
我还是一次性的说完吧、其实一共有8个类似的文件格式都是一样的、文件名字也都是以info结尾的、都放在一个目录里、怎么让每两个文件一合并、
也就是文件1,文件2合并、文件3,文件4合并、以此类推。。。
或者可以自定义哪两个合并、比如我想1和3,5和7、这两种方式都行、这次只有请神了。。。。
作者: flyinnet9    时间: 2015-7-23 14:16

等大神
  1. @echo off
  2. set /a n=0
  3. :start
  4. for /f "tokens=* delims=" %%a in ('more +%n% "1.txt"') do (
  5.   for /f "tokens=* delims=" %%b in ('more +%n% "2.txt"') do (
  6.     echo %%a ^| %%b >>3.txt
  7.     echo %%b >aa
  8.     findstr /c:"NewTime" aa && goto end
  9.     set /a n+=1
  10.     goto start
  11.   )
  12. )
  13. :end
  14. del aa
复制代码

作者: Linux9253    时间: 2015-7-23 14:34

回复 2# flyinnet9


厉害、我试了、确实做到了、上图是对齐的问题、不过这个不难、因为这些文件都是用其他脚本生成的、可以在生成的时候在后面一定数量的空格、
我刚才测试是可以的、可惜的是只能处理两个文件、多个的话好像就不行了、不过、比我强太多了、我要向你学习、谢谢哈。。。。
作者: pcl_test    时间: 2015-7-23 15:38

本帖最后由 pcl_test 于 2015-7-23 15:43 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. ::先将8个文件重命名为1~8
  3. for %%a in (1 3 5 7) do (
  4.     set /a n=%%a+1,m+=1
  5.     (for /f "delims=" %%b in (%%a.info) do (
  6.           set /p "str=%%b   |   "
  7.           echo;!str!))<!n!.info>合并!m!.info
  8. )
  9. pause
复制代码

作者: Linux9253    时间: 2015-7-23 16:18

回复 4# pcl_test


    非常感谢、代码这么简短就做到了、真是厉害、刚才我测试了、是可以的、只是在实际环境中可能会遇到以下问题、

1,数据文件是由每台服务器生成的、服务器的数量暂时是8台、但马上就会增加、我的意思是服务器的数量是奇数好像就会把最后一个文件丢掉
     偶数是很完美的、
2,
   上图中的那个位置能不能是一个文件名的列表、我的思路是这样的、不知道可行不、您先听下、
    在那个位置之前先用for循环把当前文件夹下面所有以.info结尾的文件名提取出来成列表形式、
    然后在配合%%a+列表、是不是就可以在不修改文件名的情况下完成操作呢、不知道行不行、

   刚才想了想、上面的可行性不是很大、还有中办法是把文件名列表提取出来后、在用for循环 copy 文件名列表  数字+文件名
   红色标记的地方就可以使用 数字+*.info实现、最后再删除所复制的新文件、

上面两种不知那种可行、因技术问题、还需大神看看能不能实现、我只是想在不知道具体文件名的情况下完成操作、并保留原始文件、谢谢您的帮忙。。。。
作者: pcl_test    时间: 2015-7-23 16:28

本帖最后由 pcl_test 于 2015-7-23 16:31 编辑

回复 5# Linux9253
1、奇数自然有一个无法合并
2、然并不知道你文件的命名规则,问题的根本是要让程序按怎样的规则将两个文件一一合并
作者: Linux9253    时间: 2015-7-23 16:48

回复 6# pcl_test


    问题一: 能不能先判断奇数偶数?假如是奇数的话就建立一个以.info结尾的空文件、不知是否可行、
     问题二:我这边合并不需要什么规则的、我只是想在改名字的时候保留源文件、比如、admin.info 改成1admin.info,然后对1admin.info操作、最后删除
作者: pcl_test    时间: 2015-7-23 17:06

回复 7# Linux9253

1、for+dir
2、不清楚你的目的,“不需要什么规则的”,是说任意两个文件合并就可以了吗?那么文件重命名也可以随意从某个文件从1开始更名?
作者: Linux9253    时间: 2015-7-23 17:13     标题: 感谢您

本帖最后由 Linux9253 于 2015-7-23 17:40 编辑

回复 8# pcl_test


不好意思、麻烦您这么久、我这边测试出来了、符合我的要求、谢谢哈、该下班了、祝你工作顺利
作者: pcl_test    时间: 2015-7-23 17:39

本帖最后由 pcl_test 于 2015-7-23 17:56 编辑

回复 9# Linux9253
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%a in (*.info) do (
  3.     set /a n+=1
  4.     if not defined def (
  5.         set f1=%%a&set def=1
  6.     ) else (
  7.         set f2=%%a&set def=&set /a m+=1
  8.         (for /f "usebackq delims=" %%b in ("!f1!") do (
  9.              set /p "str=%%b   |   "
  10.              echo;!str!)
  11.         )<"!f2!">合并!m!.info
  12.     )
  13. )
  14. set/a 1/(%n%%%2) 2>nul&&echo;没有合并的文件%f1%
  15. pause
复制代码

作者: Linux9253    时间: 2015-7-23 17:41     标题: 非常感谢

本帖最后由 Linux9253 于 2015-7-23 17:44 编辑

回复 10# pcl_test


你这个厉害。直接源文件测试、而且还能找出在奇数的情况下那个文件没有处理、
作者: Linux9253    时间: 2015-7-24 08:48

本帖最后由 Linux9253 于 2015-7-24 09:29 编辑

回复 11# Linux9253


    今天早上来给领导报喜、领导说很好、还需要继续改善、最好能设置谁和谁合并、我。。。。我脸皮真厚、又过来麻烦您了

刚才我尝试修改下感觉不是很理想
  1. @echo off&setlocal enabledelayedexpansion
  2. ::先将8个文件重命名为1~8
  3. ::for %%f in (*.info) do set /a y+=1 &copy %%f !y!.info
  4. set "FileList=SysInfo_CS_ZF.info SysInfo_ZZ_ZF.info,SysInfo_CS_FB53.info SysInfo_CS_FB63.info, SysInfo_ZZ_FB15.info SysInfo_ZZ_FB25.info, SysInfo_TG_FB.info
  5. SysInfo_TG_ZF.info"
  6. for %%a in (%FileList%) do set /a y+=1 & copy %%a !y!.info
  7. for %%a in (1 3 5 7) do (
  8.     set /a n=%%a+1,m+=1
  9.     (for /f "delims=" %%b in (%%a.info) do (
  10.           set /p "str=%%b   |   "
  11.           echo;!str!))<!n!.info>E:\Info\123\合并!m!.info
  12. )
  13. pause
复制代码
还有就是那个FileList变量那边、有没有办法让他这样显示、
  1. set "FileList=
  2. SysInfo_CS_ZF.infoSysInfo_ZZ_ZF.info,
  3. SysInfo_CS_FB53.infoSysInfo_CS_FB63.info,
  4. SysInfo_ZZ_FB15.infoSysInfo_ZZ_FB25.info,
  5. SysInfo_TG_FB.infoSysInfo_TG_ZF.info"
复制代码
这样别人使用的时候可修改性强点
作者: pcl_test    时间: 2015-7-24 09:31

回复 12# Linux9253
所以之前才问你“按怎样的规则将两个文件一一合并”,已封装成类函数来调用
  1. @echo off & setlocal enabledelayedexpansion
  2. call :合并 "file1" "file2"
  3. pause&exit /b
  4. :合并
  5. if {%1} equ {} (goto :eof) else if {%2} equ {} goto :eof
  6. set /a m+=1
  7. (for /f "usebackq delims=" %%b in (%1) do (
  8.     set /p "str=%%b   |   "
  9.     echo;!str!)
  10. )<%2>合并%m%%~x1
  11. goto :eof
复制代码

作者: Linux9253    时间: 2015-7-24 09:37

回复 13# pcl_test


    谢谢大神、还是你有先见之明、看到函数就想到一个问题、想问下、我之前在使用Call的时候出现
  1. ******  B A T C H   R E C U R S I O N  exceeds STACK limits ******
  2. Recursion Count=1240, Stack Usage=90 percent
  3. ******       B A T C H   PROCESSING IS   A B O R T E D      ******
复制代码
这次也是一样、脚本是循环的、函数调用的次数多了会不会也出现这样的情况?
作者: pcl_test    时间: 2015-7-24 09:40

回复 14# Linux9253

出现你这个问题,一般都是call陷入了死循环
作者: Linux9253    时间: 2015-7-24 09:43

回复 15# pcl_test


    有办法解决嘛?脚本一般都是运行一天的、
作者: pcl_test    时间: 2015-7-24 09:53

回复 16# Linux9253
嗯,排除死循环(不要问我怎么排除或让我帮忙排除),能不用call尽量别用




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