标题: [文本处理] [已解决]批处理怎样合并两个文件? [打印本页]
作者: Linux9253 时间: 2015-7-23 13:54 标题: [已解决]批处理怎样合并两个文件?
文件一:SysInfo_SJ_ZF.info- 数据转发
- ---------- -------------- -------------- ---- -------- ---------
- mksrgtg 2015-07-23 13:29:19.270 0 12 11.97
- mksdt03 2015-07-23 13:29:23.370 -1 72 70.64
- 5fhw2003 2015-07-23 13:29:17.000 3 11 9.93
- dfrq 2015-07-23 13:29:19.000 2 18 18.96
- ---------- -------------- -------------- ---- -------- ---------
- NewTime 13:29:16
复制代码
文件二:SysInfo_SJ_FB.info- 数据发布
- ---------- -------------- -------------- ---- -------- ---------
- mksrgtg 2015-07-23 13:34:13.270 2 13 11.90
- mksdt03 2015-07-23 13:43:24.370 -1 77 70.66
- 5fhw2003 2015-07-23 13:53:16.000 2 16 9.23
- dfrq 2015-07-23 13:22:12.000 6 12 18.56
- ---------- -------------- -------------- ---- -------- ---------
- NewTime 13:29:16
复制代码
现在我向把两个文件合并在一起格式是- 数据转发 | 数据发布
- ---------- -------------- -------------- ---- -------- --------- | ---------- -------------- -------------- ---- -------- ---------
- mksrgtg 2015-07-23 13:29:19.270 0 12 11.97 | mksrgtg 2015-07-23 13:34:13.270 2 13 11.90
- mksdt03 2015-07-23 13:29:23.370 -1 72 70.64 | mksdt03 2015-07-23 13:43:24.370 -1 77 70.66
- 5fhw2003 2015-07-23 13:29:17.000 3 11 9.93 | 5fhw2003 2015-07-23 13:53:16.000 2 16 9.23
- dfrq 2015-07-23 13:29:19.000 2 18 18.96 | dfrq 2015-07-23 13:22:12.000 6 12 18.56
- ---------- -------------- -------------- ---- -------- --------- | ---------- -------------- -------------- ---- -------- ---------
- 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 2 3 4 5 | 6 7 8 9 0
- 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
等大神- @echo off
- set /a n=0
- :start
- for /f "tokens=* delims=" %%a in ('more +%n% "1.txt"') do (
- for /f "tokens=* delims=" %%b in ('more +%n% "2.txt"') do (
- echo %%a ^| %%b >>3.txt
- echo %%b >aa
- findstr /c:"NewTime" aa && goto end
- set /a n+=1
- goto start
- )
- )
- :end
- del aa
复制代码
作者: Linux9253 时间: 2015-7-23 14:34
回复 2# flyinnet9
厉害、我试了、确实做到了、上图是对齐的问题、不过这个不难、因为这些文件都是用其他脚本生成的、可以在生成的时候在后面一定数量的空格、
我刚才测试是可以的、可惜的是只能处理两个文件、多个的话好像就不行了、不过、比我强太多了、我要向你学习、谢谢哈。。。。
作者: pcl_test 时间: 2015-7-23 15:38
本帖最后由 pcl_test 于 2015-7-23 15:43 编辑
- @echo off&setlocal enabledelayedexpansion
- ::先将8个文件重命名为1~8
- for %%a in (1 3 5 7) do (
- set /a n=%%a+1,m+=1
- (for /f "delims=" %%b in (%%a.info) do (
- set /p "str=%%b | "
- echo;!str!))<!n!.info>合并!m!.info
- )
- 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 - @echo off&setlocal enabledelayedexpansion
- for %%a in (*.info) do (
- set /a n+=1
- if not defined def (
- set f1=%%a&set def=1
- ) else (
- set f2=%%a&set def=&set /a m+=1
- (for /f "usebackq delims=" %%b in ("!f1!") do (
- set /p "str=%%b | "
- echo;!str!)
- )<"!f2!">合并!m!.info
- )
- )
- set/a 1/(%n%%%2) 2>nul&&echo;没有合并的文件%f1%
- 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
今天早上来给领导报喜、领导说很好、还需要继续改善、最好能设置谁和谁合并、我。。。。我脸皮真厚、又过来麻烦您了
刚才我尝试修改下感觉不是很理想- @echo off&setlocal enabledelayedexpansion
- ::先将8个文件重命名为1~8
- ::for %%f in (*.info) do set /a y+=1 © %%f !y!.info
-
- 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
- SysInfo_TG_ZF.info"
-
- for %%a in (%FileList%) do set /a y+=1 & copy %%a !y!.info
- for %%a in (1 3 5 7) do (
- set /a n=%%a+1,m+=1
- (for /f "delims=" %%b in (%%a.info) do (
- set /p "str=%%b | "
- echo;!str!))<!n!.info>E:\Info\123\合并!m!.info
- )
- pause
复制代码
还有就是那个FileList变量那边、有没有办法让他这样显示、- set "FileList=
- SysInfo_CS_ZF.infoSysInfo_ZZ_ZF.info,
- SysInfo_CS_FB53.infoSysInfo_CS_FB63.info,
- SysInfo_ZZ_FB15.infoSysInfo_ZZ_FB25.info,
- SysInfo_TG_FB.infoSysInfo_TG_ZF.info"
复制代码
这样别人使用的时候可修改性强点
作者: pcl_test 时间: 2015-7-24 09:31
回复 12# Linux9253
所以之前才问你“按怎样的规则将两个文件一一合并”,已封装成类函数来调用- @echo off & setlocal enabledelayedexpansion
- call :合并 "file1" "file2"
- pause&exit /b
- :合并
- if {%1} equ {} (goto :eof) else if {%2} equ {} goto :eof
- set /a m+=1
- (for /f "usebackq delims=" %%b in (%1) do (
- set /p "str=%%b | "
- echo;!str!)
- )<%2>合并%m%%~x1
- goto :eof
复制代码
作者: Linux9253 时间: 2015-7-24 09:37
回复 13# pcl_test
谢谢大神、还是你有先见之明、看到函数就想到一个问题、想问下、我之前在使用Call的时候出现- ****** B A T C H R E C U R S I O N exceeds STACK limits ******
- Recursion Count=1240, Stack Usage=90 percent
- ****** 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://bbs.bathome.net/) |
Powered by Discuz! 7.2 |